forked from sheetjs/sheetjs
		
	pulling ssf into main project [ci skip]
This commit is contained in:
		
						commit
						b738e5d3f1
					
				
							
								
								
									
										1
									
								
								packages/ssf-cli/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								packages/ssf-cli/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| node_modules/ | ||||
							
								
								
									
										1
									
								
								packages/ssf-cli/.npmignore
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								packages/ssf-cli/.npmignore
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| *.tgz | ||||
							
								
								
									
										48
									
								
								packages/ssf-cli/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										48
									
								
								packages/ssf-cli/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| # [SSF Command-Line Interface](http://sheetjs.com) | ||||
| 
 | ||||
| ssf (SpreadSheet Format) is a pure JS library to format data using ECMA-376 | ||||
| spreadsheet format codes (used in popular spreadsheet software packages). | ||||
| 
 | ||||
| This CLI tool formats numbers from shell scripts and other command-line tools. | ||||
| 
 | ||||
| ## Installation | ||||
| 
 | ||||
| With [npm](https://www.npmjs.org/package/ssf-cli): | ||||
| 
 | ||||
| ```bash | ||||
| $ npm install -g ssf-cli | ||||
| ``` | ||||
| 
 | ||||
| ## Usage | ||||
| 
 | ||||
| `ssf-cli` takes two arguments: the format string and the value to be formatted. | ||||
| 
 | ||||
| The value is formatted twice, once interpreting the value as a string and once | ||||
| interpreting the value as a number, and both results are printed to standard | ||||
| output, with a pipe character `|` after each value: | ||||
| 
 | ||||
| ```bash | ||||
| $ bin/ssf.njs "#,##0.00" 12345 | ||||
| 12345|12,345.00| | ||||
| $ bin/ssf.njs "0;0;0;:@:" 12345 | ||||
| :12345:|12345| | ||||
| ``` | ||||
| 
 | ||||
| Extracting the values in a pipeline is straightforward with AWK: | ||||
| 
 | ||||
| ```bash | ||||
| $ bin/ssf.njs "#,##0.00" 12345 | awk -F\| '{print $2}' | ||||
| 12,345.00 | ||||
| ``` | ||||
| 
 | ||||
| ## License | ||||
| 
 | ||||
| Please consult the attached LICENSE file for details.  All rights not explicitly | ||||
| granted by the Apache 2.0 license are reserved by the Original Author. | ||||
| 
 | ||||
| ## Credits | ||||
| 
 | ||||
| Special thanks to [Garrett Luu](https://garrettluu.com/) for spinning off the | ||||
| command from the SSF module. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/ssf) | ||||
							
								
								
									
										8
									
								
								packages/ssf-cli/bin/ssf.njs
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										8
									
								
								packages/ssf-cli/bin/ssf.njs
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,8 @@ | ||||
| #!/usr/bin/env node | ||||
| /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* eslint-env node */ | ||||
| /* eslint no-console:0 */ | ||||
| /*jshint node:true */ | ||||
| var cli = require('../'); | ||||
| 
 | ||||
| cli(); | ||||
							
								
								
									
										16
									
								
								packages/ssf-cli/index.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								packages/ssf-cli/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* eslint-env node */ | ||||
| /* eslint no-console:0 */ | ||||
| /*jshint node:true */ | ||||
| var X = require('ssf'); | ||||
| function run() { | ||||
|   var argv = process.argv.slice(2); | ||||
|   if (argv.length < 2 || argv[0] == "-h" || argv[0] == "--help") { | ||||
|     console.error("usage: ssf-cli <format> <value>"); | ||||
|     console.error("output: format_as_string|format_as_number|"); | ||||
|     process.exit(0); | ||||
|   } | ||||
|   console.log(X.format(argv[0], argv[1]) + "|" + X.format(argv[0], +(argv[1])) + "|"); | ||||
| } | ||||
| 
 | ||||
| module.exports = run; | ||||
							
								
								
									
										31
									
								
								packages/ssf-cli/package.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										31
									
								
								packages/ssf-cli/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| { | ||||
| 	"name": "ssf-cli", | ||||
| 	"version": "1.1.0", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "Command-line interface for ssf", | ||||
| 	"keywords": [ | ||||
| 		"format", | ||||
| 		"sprintf", | ||||
| 		"spreadsheet" | ||||
| 	], | ||||
| 	"main": "index.js", | ||||
| 	"bin": { | ||||
| 		"ssf-cli": "bin/ssf.njs" | ||||
| 	}, | ||||
| 	"dependencies": { | ||||
| 		"ssf": "^0.11.2" | ||||
| 	}, | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
| 		"url": "git://github.com/SheetJS/sheetjs.git", | ||||
| 		"directory": "packages/ssf-cli" | ||||
| 	}, | ||||
| 	"homepage": "http://sheetjs.com/", | ||||
| 	"bugs": { | ||||
| 		"url": "https://github.com/SheetJS/sheetjs/issues" | ||||
| 	}, | ||||
| 	"license": "Apache-2.0", | ||||
| 	"engines": { | ||||
| 		"node": ">=0.8" | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										24
									
								
								packages/ssf/.eslintrc
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								packages/ssf/.eslintrc
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| { | ||||
| 	"env": { "shared-node-browser":true }, | ||||
| 	"globals": {}, | ||||
| 	"parserOptions": { | ||||
| 		"ecmaVersion": 3 | ||||
| 	}, | ||||
| 	"plugins": [ "html", "json" ], | ||||
| 	"extends": "eslint:recommended", | ||||
| 	"rules": { | ||||
| 		"comma-style": [ 2, "last" ], | ||||
| 		"comma-dangle": [ 2, "never" ], | ||||
| 		"curly": 0, | ||||
| 		"no-bitwise": 0, | ||||
| 		"no-console": 0, | ||||
| 		"no-control-regex": 0, | ||||
| 		"no-empty": 0, | ||||
| 		"no-trailing-spaces": 2, | ||||
| 		"no-use-before-define": [ 1, { | ||||
| 			"functions":false, "classes":true, "variables":false | ||||
| 		}], | ||||
| 		"no-useless-escape": 0, | ||||
| 		"semi": [ 2, "always" ] | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										31
									
								
								packages/ssf/.flowconfig
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										31
									
								
								packages/ssf/.flowconfig
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| [ignore] | ||||
| .*/node_modules/.* | ||||
| .*/dist/.* | ||||
| .*/test/bits/.* | ||||
| .*/test/.* | ||||
| .*/ssf.js | ||||
| .*/ssf_lc.js | ||||
| 
 | ||||
| .*/bits/.* | ||||
| .*/ctest/.* | ||||
| .*/misc/.* | ||||
| .*/perf/.* | ||||
| .*/tmp/.* | ||||
| .*/tmp/.* | ||||
| 
 | ||||
| .*/demo/browser.js | ||||
| .*/shim.js | ||||
| 
 | ||||
| [include] | ||||
| ssf.flow.js | ||||
| .*/bin/.*.njs | ||||
| 
 | ||||
| [libs] | ||||
| misc/flow.js | ||||
| misc/flowdeps.js | ||||
| 
 | ||||
| [options] | ||||
| module.file_ext=.js | ||||
| module.file_ext=.njs | ||||
| module.ignore_non_literal_requires=true | ||||
| suppress_comment= \\(.\\|\n\\)*\\$FlowIgnore | ||||
							
								
								
									
										28
									
								
								packages/ssf/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28
									
								
								packages/ssf/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| node_modules | ||||
| misc/coverage.html | ||||
| .vocrc | ||||
| v8.log | ||||
| tmp | ||||
| *.tgz | ||||
| *.[tT][xX][tT] | ||||
| *.[cC][sS][vV] | ||||
| *.[dD][iIbB][fF] | ||||
| *.[pP][rR][nN] | ||||
| *.[sS][lL][kK] | ||||
| *.socialcalc | ||||
| *.[xX][lL][sSwWcC] | ||||
| *.[xX][lL][sS][xXmMbB] | ||||
| *.[oO][dD][sS] | ||||
| *.[fF][oO][dD][sS] | ||||
| *.[xX][mM][lL] | ||||
| *.[uU][oO][sS] | ||||
| *.[wW][kKqQbB][S1234567890] | ||||
| *.[qQ][pP][wW] | ||||
| *.123 | ||||
| *.htm | ||||
| *.html | ||||
| *.sheetjs | ||||
| *.exe | ||||
| perf.log | ||||
| ctest/test.js | ||||
| ctest/sauce* | ||||
							
								
								
									
										6
									
								
								packages/ssf/.jscs.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								packages/ssf/.jscs.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| { | ||||
|   "requireCommaBeforeLineBreak": true, | ||||
|   "disallowTrailingWhitespace": true, | ||||
|   "disallowTrailingComma": true | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										51
									
								
								packages/ssf/.npmignore
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										51
									
								
								packages/ssf/.npmignore
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| test/ | ||||
| ctest/ | ||||
| index.html | ||||
| misc/ | ||||
| packages/ | ||||
| node_modules | ||||
| *.tgz | ||||
| _book | ||||
| book.json | ||||
| tmp | ||||
| mocha.js | ||||
| *.[tT][xX][tT] | ||||
| *.[cC][sS][vV] | ||||
| *.[dD][iIbB][fF] | ||||
| *.[pP][rR][nN] | ||||
| *.[sS][lL][kK] | ||||
| *.socialcalc | ||||
| *.[xX][lL][sSwWcCaAtTmM] | ||||
| *.[xX][lL][sSaAtT][xXmMbB] | ||||
| *.[oO][dD][sS] | ||||
| *.[fF][oO][dD][sS] | ||||
| *.[xX][mM][lL] | ||||
| *.[uU][oO][sS] | ||||
| *.[wW][kKqQbB][S1234567890] | ||||
| *.[qQ][pP][wW] | ||||
| *.[bB][iI][fF][fF][23458] | ||||
| *.[rR][tT][fF] | ||||
| *.[eE][tT][hH] | ||||
| *.123 | ||||
| *.htm | ||||
| *.html | ||||
| *.sheetjs | ||||
| *.exe | ||||
| *.img | ||||
| .gitignore | ||||
| .gitattributes | ||||
| .fossaignore | ||||
| .spelling | ||||
| .eslintrc | ||||
| .jshintrc | ||||
| Makefile | ||||
| .npmignore | ||||
| .jscs.json | ||||
| .gitmodules | ||||
| .travis.yml | ||||
| .flowconfig | ||||
| bits/ | ||||
| .vocrc | ||||
| v8.log | ||||
| perf.log | ||||
| ssf.md | ||||
							
								
								
									
										9
									
								
								packages/ssf/.spelling
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										9
									
								
								packages/ssf/.spelling
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| # ssf.js (C) 2013-present SheetJS -- http://sheetjs.com | ||||
| SheetJS | ||||
| ssf | ||||
| 
 | ||||
| ECMA-376 | ||||
| xls | ||||
| xlsb | ||||
| 
 | ||||
| npm | ||||
							
								
								
									
										45
									
								
								packages/ssf/.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										45
									
								
								packages/ssf/.travis.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| language: node_js | ||||
| dist: xenial | ||||
| node_js: | ||||
|   - "14" | ||||
|   - "13" | ||||
|   - "12" | ||||
|   - "11" | ||||
|   - "10" | ||||
|   - "9" | ||||
|   - "8" | ||||
|   - "7" | ||||
|   - "6" | ||||
|   - "5" | ||||
|   - "4" | ||||
|   - "0.12" | ||||
|   - "0.10" | ||||
|   - "0.8" | ||||
| matrix: | ||||
|   include: | ||||
|     - node_js: "14" | ||||
|       env: TZ="America/New_York" | ||||
|     - node_js: "12" | ||||
|       env: TZ="America/Los_Angeles" | ||||
|     - node_js: "10" | ||||
|       env: TZ="Europe/London" | ||||
|     - node_js: "8" | ||||
|       env: TZ="Europe/Berlin" | ||||
|     - node_js: "6" | ||||
|       env: TZ="Asia/Kolkata" | ||||
|     - node_js: "4" | ||||
|       env: TZ="Asia/Shanghai" | ||||
|     - node_js: "0.12" | ||||
|       env: TZ="Asia/Seoul" | ||||
| 
 | ||||
| before_install: | ||||
|   - "npm config set strict-ssl false" | ||||
|   - "./misc/node_version.sh" | ||||
|   - "npm install -g mocha@2.x voc" | ||||
|   - "npm install blanket" | ||||
|   - "npm install word" | ||||
|   - "npm install coveralls mocha-lcov-reporter" | ||||
| install: | ||||
|   - npm install | ||||
| after_success: | ||||
|   - "make coveralls" | ||||
							
								
								
									
										201
									
								
								packages/ssf/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										201
									
								
								packages/ssf/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,201 @@ | ||||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
| 
 | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
| 
 | ||||
|    1. Definitions. | ||||
| 
 | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
| 
 | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
| 
 | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
| 
 | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
| 
 | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
| 
 | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
| 
 | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
| 
 | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
| 
 | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
| 
 | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
| 
 | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
| 
 | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
| 
 | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
| 
 | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
| 
 | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
| 
 | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
| 
 | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
| 
 | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
| 
 | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
| 
 | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
| 
 | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
| 
 | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
| 
 | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
| 
 | ||||
|    END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
| 
 | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "{}" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
| 
 | ||||
|    Copyright (C) 2013-present   SheetJS LLC | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										124
									
								
								packages/ssf/Makefile
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										124
									
								
								packages/ssf/Makefile
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,124 @@ | ||||
| SHELL=/bin/bash | ||||
| LIB=ssf | ||||
| REQS= | ||||
| ADDONS= | ||||
| AUXTARGETS= | ||||
| CMDS=bin/ssf.njs | ||||
| HTMLLINT=index.html | ||||
| 
 | ||||
| ULIB=$(shell echo $(LIB) | tr a-z A-Z) | ||||
| DEPS=$(sort $(wildcard bits/*.js)) | ||||
| TARGET=$(LIB).js | ||||
| FLOWTARGET=$(LIB).flow.js | ||||
| FLOWAUX=$(patsubst %.js,%.flow.js,$(AUXTARGETS)) | ||||
| AUXSCPTS= | ||||
| FLOWTGTS=$(TARGET) $(AUXTARGETS) $(AUXSCPTS) | ||||
| UGLIFYOPTS=--support-ie8 | ||||
| CLOSURE=/usr/local/lib/node_modules/google-closure-compiler/compiler.jar | ||||
| 
 | ||||
| ## Main Targets
 | ||||
| 
 | ||||
| .PHONY: all | ||||
| all: $(TARGET) $(AUXTARGETS) $(AUXSCPTS) ## Build library and auxiliary scripts
 | ||||
| 
 | ||||
| $(FLOWTGTS): %.js : %.flow.js | ||||
| 	node -e 'process.stdout.write(require("fs").readFileSync("$<","utf8").replace(/^[ \t]*\/\*[:#][^*]*\*\/\s*(\n)?/gm,"").replace(/\/\*[:#][^*]*\*\//gm,""))' > $@ | ||||
| 
 | ||||
| $(FLOWTARGET): $(DEPS) | ||||
| 	cat $^ | tr -d '\15\32' > $@ | ||||
| 
 | ||||
| bits/01_version.js: package.json | ||||
| 	echo "$(ULIB).version = '"`grep version package.json | awk '{gsub(/[^0-9a-z\.-]/,"",$$2); print $$2}'`"';" > $@ | ||||
| 
 | ||||
| .PHONY: clean | ||||
| clean: ## Remove targets and build artifacts
 | ||||
| 	rm -f $(TARGET) $(FLOWTARGET) | ||||
| 
 | ||||
| .PHONY: git | ||||
| git: ## show version string
 | ||||
| 	@echo "$$(node -pe 'require("./package.json").version') (ssf)" | ||||
| 
 | ||||
| 
 | ||||
| ## Testing
 | ||||
| 
 | ||||
| .PHONY: test mocha | ||||
| test mocha: ## Run test suite
 | ||||
| 	mocha -R spec -t 30000 | ||||
| 
 | ||||
| .PHONY: test_misc | ||||
| test_misc: | ||||
| 	MINTEST=1 mocha -R spec -t 30000 | ||||
| 
 | ||||
| .PHONY: travis | ||||
| travis: ## Run test suite with minimal output
 | ||||
| 	mocha -R dot -t 30000 | ||||
| 
 | ||||
| .PHONY: ctest | ||||
| ctest: ## Build browser test fixtures
 | ||||
| 	browserify -t brfs test/{comma,dateNF,dates,exp,fraction,general,implied,oddities,utilities,valid}.js > ctest/test.js | ||||
| 
 | ||||
| .PHONY: ctestserv | ||||
| ctestserv: ## Start a test server on port 8000
 | ||||
| 	@cd ctest && python -mSimpleHTTPServer | ||||
| 
 | ||||
| 
 | ||||
| ## Code Checking
 | ||||
| 
 | ||||
| .PHONY: fullint | ||||
| fullint: lint old-lint tslint flow mdlint ## Run all checks
 | ||||
| 
 | ||||
| .PHONY: lint | ||||
| lint: $(TARGET) $(AUXTARGETS) ## Run eslint checks
 | ||||
| 	@eslint --ext .js,.njs,.json,.html,.htm $(TARGET) $(AUXTARGETS) $(CMDS) $(HTMLLINT) package.json | ||||
| 	if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi | ||||
| 
 | ||||
| .PHONY: old-lint | ||||
| old-lint: $(TARGET) $(AUXTARGETS) ## Run jshint and jscs checks
 | ||||
| 	@jshint --show-non-errors $(TARGET) $(AUXTARGETS) | ||||
| 	@jshint --show-non-errors $(CMDS) | ||||
| 	@jshint --show-non-errors package.json test/ | ||||
| 	@jshint --show-non-errors --extract=always $(HTMLLINT) | ||||
| 	@jscs $(TARGET) $(AUXTARGETS) test/*.js | ||||
| 	if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi | ||||
| 
 | ||||
| .PHONY: tslint | ||||
| tslint: $(TARGET) ## Run typescript checks
 | ||||
| 	#@npm install dtslint typescript | ||||
| 	#@npm run-script dtslint | ||||
| 	dtslint types | ||||
| 
 | ||||
| .PHONY: flow | ||||
| flow: lint ## Run flow checker
 | ||||
| 	@flow check --all --show-all-errors | ||||
| 
 | ||||
| .PHONY: cov | ||||
| cov: misc/coverage.html ## Run coverage test
 | ||||
| 
 | ||||
| .PHONY: cov_min | ||||
| cov_min: | ||||
| 	MINTEST=1 make cov | ||||
| 
 | ||||
| misc/coverage.html: $(TARGET) | ||||
| 	mocha --require blanket -R html-cov -t 20000 > $@ | ||||
| 
 | ||||
| .PHONY: full_coveralls | ||||
| full_coveralls: | ||||
| 	mocha --require blanket --reporter mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js | ||||
| 
 | ||||
| .PHONY: coveralls | ||||
| coveralls: ## Coverage Test + Send to coveralls.io
 | ||||
| 	MINTEST=1 make full_coveralls | ||||
| 
 | ||||
| MDLINT=README.md | ||||
| .PHONY: mdlint | ||||
| mdlint: $(MDLINT) ## Check markdown documents
 | ||||
| 	alex $^ | ||||
| 	mdspell -a -n -x -r --en-us $^ | ||||
| 
 | ||||
| .PHONY: help | ||||
| help: | ||||
| 	@grep -hE '(^[a-zA-Z_-][ a-zA-Z_-]*:.*?|^#[#*])' $(MAKEFILE_LIST) | bash misc/help.sh | ||||
| 
 | ||||
| #* To show a spinner, append "-spin" to any target e.g. cov-spin
 | ||||
| %-spin: | ||||
| 	@make $* & bash misc/spin.sh $$! | ||||
							
								
								
									
										119
									
								
								packages/ssf/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										119
									
								
								packages/ssf/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | ||||
| # [SheetJS SSF](http://sheetjs.com) | ||||
| 
 | ||||
| ssf (SpreadSheet Format) is a pure JS library to format data using ECMA-376 | ||||
| spreadsheet format codes (used in popular spreadsheet software packages). | ||||
| 
 | ||||
| This is the community version.  We also offer a pro version with additional | ||||
| features like international support as well as dedicated support. | ||||
| 
 | ||||
| ## Installation | ||||
| 
 | ||||
| With [npm](https://www.npmjs.org/package/ssf): | ||||
| 
 | ||||
| ```bash | ||||
| $ npm install ssf | ||||
| ``` | ||||
| 
 | ||||
| In the browser: | ||||
| 
 | ||||
| ```html | ||||
| <script src="ssf.js"></script> | ||||
| ``` | ||||
| 
 | ||||
| The browser exposes a variable `SSF` | ||||
| 
 | ||||
| When installed globally, npm installs a script `ssf` that renders the format | ||||
| string with the given arguments.  Running the script with `-h` displays help. | ||||
| 
 | ||||
| The script will manipulate `module.exports` if available .  This is not always | ||||
| desirable.  To prevent the behavior, define `DO_NOT_EXPORT_SSF`. | ||||
| 
 | ||||
| ## Usage | ||||
| 
 | ||||
| `SSF.format(fmt, val, opts)` formats `val` using the format `fmt`. | ||||
| 
 | ||||
| If `fmt` is a string, it will be parsed and evaluated.  If `fmt` is a `number`, | ||||
| the actual format will be the corresponding entry in the internal format table. | ||||
| For a raw numeric format like `000`, the value should be passed as a string. | ||||
| 
 | ||||
| Date arguments are interpreted in the local time of the JS client. | ||||
| 
 | ||||
| The options argument may contain the following keys: | ||||
| 
 | ||||
| | Option Name | Default | Description                                          | | ||||
| | :---------- | :-----: | :--------------------------------------------------- | | ||||
| | `date1904`  | false   | Use 1904 date system if true, 1900 system if false   | | ||||
| 
 | ||||
| ### Manipulating the Internal Format Table | ||||
| 
 | ||||
| Binary spreadsheet formats store cell formats in a table and reference by index. | ||||
| This library uses a global table: | ||||
| 
 | ||||
| `SSF._table` is the underlying object, mapping numeric keys to format strings. | ||||
| 
 | ||||
| `SSF.load(fmt:string, idx:?number):number` assigns the format to the specified | ||||
| index and returns the index.  If the index is not specified, SSF will search the | ||||
| space for an available format slot pick an unused slot.  For compatibility with | ||||
| the XLS and XLSB file formats, custom indices should be in the valid ranges | ||||
| `5-8`, `23-26`, `41-44`, `63-66`, `164-382` (see `[MS-XLSB] 2.4.655 BrtFmt`) | ||||
| 
 | ||||
| `SSF.get_table()` gets the internal format table (number to format mapping). | ||||
| 
 | ||||
| `SSF.load_table(table)` sets the internal format table. | ||||
| 
 | ||||
| ### Other Utilities | ||||
| 
 | ||||
| `SSF.parse_date_code(val:number, opts:?any)` parses `val`, returning an object: | ||||
| 
 | ||||
| ```typescript | ||||
| type SSFDate = { | ||||
|   D:number; /* number of whole days since relevant epoch, 0 <= D */ | ||||
|   y:number; /* integral year portion, epoch_year <= y */ | ||||
|   m:number; /* integral month portion, 1 <= m <= 12 */ | ||||
|   d:number; /* integral day portion, subject to gregorian YMD constraints */ | ||||
|   q:number; /* integral day of week (0=Sunday .. 6=Saturday) 0 <= q <= 6 */ | ||||
| 
 | ||||
|   T:number; /* number of seconds since midnight, 0 <= T < 86400 */ | ||||
|   H:number; /* integral number of hours since midnight, 0 <= H < 24 */ | ||||
|   M:number; /* integral number of minutes since the last hour, 0 <= M < 60 */ | ||||
|   S:number; /* integral number of seconds since the last minute, 0 <= S < 60 */ | ||||
|   u:number; /* sub-second part of time, 0 <= u < 1 */ | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| `SSF.is_date(fmt:string):boolean` returns `true` if `fmt` encodes a date format. | ||||
| 
 | ||||
| ## Examples | ||||
| 
 | ||||
| - [Basic Demo](http://oss.sheetjs.com/ssf/) | ||||
| - [Custom Formats Builder](https://customformats.com) | ||||
| 
 | ||||
| ## Related Packages | ||||
| 
 | ||||
| [`ssf-cli`](https://www.npmjs.com/package/ssf-cli) is a simple NodeJS command | ||||
| line tool for formatting numbers. | ||||
| 
 | ||||
| ## License | ||||
| 
 | ||||
| Please consult the attached LICENSE file for details.  All rights not explicitly | ||||
| granted by the Apache 2.0 license are reserved by the Original Author. | ||||
| 
 | ||||
| ## References | ||||
| 
 | ||||
|  - `ECMA-376`: Office Open XML File Formats | ||||
|  - `MS-XLS`: Excel Binary File Format (.xls) Structure Specification | ||||
|  - `MS-XLSB`: Excel (.xlsb) Binary File Format | ||||
| 
 | ||||
| ## Badges | ||||
| 
 | ||||
| [](https://saucelabs.com/u/ssfjs) | ||||
| 
 | ||||
| [](https://travis-ci.org/SheetJS/ssf) | ||||
| 
 | ||||
| [](https://coveralls.io/r/SheetJS/ssf?branch=master) | ||||
| 
 | ||||
| [](https://npmjs.org/package/ssf) | ||||
| 
 | ||||
| [](https://david-dm.org/sheetjs/ssf) | ||||
| 
 | ||||
| [](https://github.com/SheetJS/ssf) | ||||
							
								
								
									
										6
									
								
								packages/ssf/bits/00_header.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								packages/ssf/bits/00_header.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint -W041 */ | ||||
| /*:: declare var DO_NOT_EXPORT_SSF: any; */ | ||||
| var SSF/*:SSFModule*/ = ({}/*:any*/); | ||||
| var make_ssf = function make_ssf(SSF/*:SSFModule*/){ | ||||
							
								
								
									
										1
									
								
								packages/ssf/bits/01_version.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								packages/ssf/bits/01_version.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| SSF.version = '0.11.2'; | ||||
							
								
								
									
										10
									
								
								packages/ssf/bits/02_utilities.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								packages/ssf/bits/02_utilities.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| function _strrev(x/*:string*/)/*:string*/ { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; } | ||||
| function fill(c/*:string*/,l/*:number*/)/*:string*/ { var o = ""; while(o.length < l) o+=c; return o; } | ||||
| function pad0(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| function pad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;} | ||||
| function rpad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);} | ||||
| function pad0r1(v/*:any*/,d/*:number*/)/*:string*/{var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| function pad0r2(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| var p2_32 = Math.pow(2,32); | ||||
| function pad0r(v/*:any*/,d/*:number*/)/*:string*/{if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); } | ||||
| function isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; } | ||||
							
								
								
									
										3
									
								
								packages/ssf/bits/10_types.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								packages/ssf/bits/10_types.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| /*:: | ||||
| type SSF_write_num = {(type:string, fmt:string, val:number):string}; | ||||
| */ | ||||
							
								
								
									
										23
									
								
								packages/ssf/bits/20_consts.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										23
									
								
								packages/ssf/bits/20_consts.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| var days/*:Array<Array<string> >*/ = [ | ||||
| 	['Sun', 'Sunday'], | ||||
| 	['Mon', 'Monday'], | ||||
| 	['Tue', 'Tuesday'], | ||||
| 	['Wed', 'Wednesday'], | ||||
| 	['Thu', 'Thursday'], | ||||
| 	['Fri', 'Friday'], | ||||
| 	['Sat', 'Saturday'] | ||||
| ]; | ||||
| var months/*:Array<Array<string> >*/ = [ | ||||
| 	['J', 'Jan', 'January'], | ||||
| 	['F', 'Feb', 'February'], | ||||
| 	['M', 'Mar', 'March'], | ||||
| 	['A', 'Apr', 'April'], | ||||
| 	['M', 'May', 'May'], | ||||
| 	['J', 'Jun', 'June'], | ||||
| 	['J', 'Jul', 'July'], | ||||
| 	['A', 'Aug', 'August'], | ||||
| 	['S', 'Sep', 'September'], | ||||
| 	['O', 'Oct', 'October'], | ||||
| 	['N', 'Nov', 'November'], | ||||
| 	['D', 'Dec', 'December'] | ||||
| ]; | ||||
							
								
								
									
										34
									
								
								packages/ssf/bits/25_table.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										34
									
								
								packages/ssf/bits/25_table.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| function init_table(t/*:any*/) { | ||||
| 	t[0]=  'General'; | ||||
| 	t[1]=  '0'; | ||||
| 	t[2]=  '0.00'; | ||||
| 	t[3]=  '#,##0'; | ||||
| 	t[4]=  '#,##0.00'; | ||||
| 	t[9]=  '0%'; | ||||
| 	t[10]= '0.00%'; | ||||
| 	t[11]= '0.00E+00'; | ||||
| 	t[12]= '# ?/?'; | ||||
| 	t[13]= '# ??/??'; | ||||
| 	t[14]= 'm/d/yy'; | ||||
| 	t[15]= 'd-mmm-yy'; | ||||
| 	t[16]= 'd-mmm'; | ||||
| 	t[17]= 'mmm-yy'; | ||||
| 	t[18]= 'h:mm AM/PM'; | ||||
| 	t[19]= 'h:mm:ss AM/PM'; | ||||
| 	t[20]= 'h:mm'; | ||||
| 	t[21]= 'h:mm:ss'; | ||||
| 	t[22]= 'm/d/yy h:mm'; | ||||
| 	t[37]= '#,##0 ;(#,##0)'; | ||||
| 	t[38]= '#,##0 ;[Red](#,##0)'; | ||||
| 	t[39]= '#,##0.00;(#,##0.00)'; | ||||
| 	t[40]= '#,##0.00;[Red](#,##0.00)'; | ||||
| 	t[45]= 'mm:ss'; | ||||
| 	t[46]= '[h]:mm:ss'; | ||||
| 	t[47]= 'mmss.0'; | ||||
| 	t[48]= '##0.0E+0'; | ||||
| 	t[49]= '@'; | ||||
| 	t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "'; | ||||
| } | ||||
| 
 | ||||
| var table_fmt = {}; | ||||
| init_table(table_fmt); | ||||
							
								
								
									
										55
									
								
								packages/ssf/bits/26_defaults.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										55
									
								
								packages/ssf/bits/26_defaults.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| /* Defaults determined by systematically testing in Excel 2019 */ | ||||
| 
 | ||||
| /* These formats appear to default to other formats in the table */ | ||||
| var default_map/*:Array<number>*/ = []; | ||||
| var defi = 0; | ||||
| 
 | ||||
| //  5 -> 37 ...  8 -> 40
 | ||||
| for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi; | ||||
| 
 | ||||
| // 23 ->  0 ... 26 ->  0
 | ||||
| for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0; | ||||
| 
 | ||||
| // 27 -> 14 ... 31 -> 14
 | ||||
| for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14; | ||||
| // 50 -> 14 ... 58 -> 14
 | ||||
| for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14; | ||||
| 
 | ||||
| // 59 ->  1 ... 62 ->  4
 | ||||
| for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58; | ||||
| // 67 ->  9 ... 68 -> 10
 | ||||
| for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58; | ||||
| // 72 -> 14 ... 75 -> 17
 | ||||
| for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58; | ||||
| 
 | ||||
| // 69 -> 12 ... 71 -> 14
 | ||||
| for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57; | ||||
| 
 | ||||
| // 76 -> 20 ... 78 -> 22
 | ||||
| for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56; | ||||
| 
 | ||||
| // 79 -> 45 ... 81 -> 47
 | ||||
| for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34; | ||||
| 
 | ||||
| // 82 ->  0 ... 65536 -> 0 (omitted)
 | ||||
| 
 | ||||
| /* These formats technically refer to Accounting formats with no equivalent */ | ||||
| var default_str/*:Array<string>*/ = []; | ||||
| 
 | ||||
| //  5 -- Currency,   0 decimal, black negative
 | ||||
| default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)'; | ||||
| //  6 -- Currency,   0 decimal, red   negative
 | ||||
| default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)'; | ||||
| //  7 -- Currency,   2 decimal, black negative
 | ||||
| default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)'; | ||||
| //  8 -- Currency,   2 decimal, red   negative
 | ||||
| default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)'; | ||||
| 
 | ||||
| // 41 -- Accounting, 0 decimal, No Symbol
 | ||||
| default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)'; | ||||
| // 42 -- Accounting, 0 decimal, $  Symbol
 | ||||
| default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)'; | ||||
| // 43 -- Accounting, 2 decimal, No Symbol
 | ||||
| default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)'; | ||||
| // 44 -- Accounting, 2 decimal, $  Symbol
 | ||||
| default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'; | ||||
							
								
								
									
										20
									
								
								packages/ssf/bits/30_frac.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										20
									
								
								packages/ssf/bits/30_frac.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| function frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/ { | ||||
| 	var sgn = x < 0 ? -1 : 1; | ||||
| 	var B = x * sgn; | ||||
| 	var P_2 = 0, P_1 = 1, P = 0; | ||||
| 	var Q_2 = 1, Q_1 = 0, Q = 0; | ||||
| 	var A = Math.floor(B); | ||||
| 	while(Q_1 < D) { | ||||
| 		A = Math.floor(B); | ||||
| 		P = A * P_1 + P_2; | ||||
| 		Q = A * Q_1 + Q_2; | ||||
| 		if((B - A) < 0.00000005) break; | ||||
| 		B = 1 / (B - A); | ||||
| 		P_2 = P_1; P_1 = P; | ||||
| 		Q_2 = Q_1; Q_1 = Q; | ||||
| 	} | ||||
| 	if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } } | ||||
| 	if(!mixed) return [0, sgn * P, Q]; | ||||
| 	var q = Math.floor(sgn * P/Q); | ||||
| 	return [q, sgn*P - q*Q, Q]; | ||||
| } | ||||
							
								
								
									
										40
									
								
								packages/ssf/bits/35_datecode.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										40
									
								
								packages/ssf/bits/35_datecode.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| function parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) { | ||||
| 	if(v > 2958465 || v < 0) return null; | ||||
| 	var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0; | ||||
| 	var dout=[]; | ||||
| 	var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0}; | ||||
| 	if(Math.abs(out.u) < 1e-6) out.u = 0; | ||||
| 	if(opts && opts.date1904) date += 1462; | ||||
| 	if(out.u > 0.9999) { | ||||
| 		out.u = 0; | ||||
| 		if(++time == 86400) { out.T = time = 0; ++date; ++out.D; } | ||||
| 	} | ||||
| 	if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;} | ||||
| 	else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;} | ||||
| 	else { | ||||
| 		if(date > 60) --date; | ||||
| 		/* 1 = Jan 1 1900 in Gregorian */ | ||||
| 		var d = new Date(1900, 0, 1); | ||||
| 		d.setDate(d.getDate() + date - 1); | ||||
| 		dout = [d.getFullYear(), d.getMonth()+1,d.getDate()]; | ||||
| 		dow = d.getDay(); | ||||
| 		if(date < 60) dow = (dow + 6) % 7; | ||||
| 		if(b2) dow = fix_hijri(d, dout); | ||||
| 	} | ||||
| 	out.y = dout[0]; out.m = dout[1]; out.d = dout[2]; | ||||
| 	out.S = time % 60; time = Math.floor(time / 60); | ||||
| 	out.M = time % 60; time = Math.floor(time / 60); | ||||
| 	out.H = time; | ||||
| 	out.q = dow; | ||||
| 	return out; | ||||
| } | ||||
| SSF.parse_date_code = parse_date_code; | ||||
| var basedate = new Date(1899, 11, 31, 0, 0, 0); | ||||
| var dnthresh = basedate.getTime(); | ||||
| var base1904 = new Date(1900, 2, 1, 0, 0, 0); | ||||
| function datenum_local(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch -= 1461*24*60*60*1000; | ||||
| 	else if(v >= base1904) epoch += 24*60*60*1000; | ||||
| 	return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
							
								
								
									
										71
									
								
								packages/ssf/bits/40_general.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										71
									
								
								packages/ssf/bits/40_general.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| /* The longest 32-bit integer text is "-4294967296", exactly 11 chars */ | ||||
| function general_fmt_int(v/*:number*/)/*:string*/ { return v.toString(10); } | ||||
| SSF._general_int = general_fmt_int; | ||||
| 
 | ||||
| /* ECMA-376 18.8.30 numFmt*/ | ||||
| /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */ | ||||
| var general_fmt_num = (function make_general_fmt_num() { | ||||
| 	var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/; | ||||
| 	function strip_decimal(o/*:string*/)/*:string*/ { | ||||
| 		return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1"); | ||||
| 	} | ||||
| 
 | ||||
| 	/* General Exponential always shows 2 digits exp and trims the mantissa */ | ||||
| 	var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/; | ||||
| 	var exp_with_single_digit = /(E[+-])(\d)$/; | ||||
| 	function normalize_exp(o/*:string*/)/*:string*/ { | ||||
| 		if(o.indexOf("E") == -1) return o; | ||||
| 		return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2"); | ||||
| 	} | ||||
| 
 | ||||
| 	/* exponent >= -9 and <= 9 */ | ||||
| 	function small_exp(v/*:number*/)/*:string*/ { | ||||
| 		var w = (v<0?12:11); | ||||
| 		var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o; | ||||
| 		o = v.toPrecision(10); if(o.length <= w) return o; | ||||
| 		return v.toExponential(5); | ||||
| 	} | ||||
| 
 | ||||
| 	/* exponent >= 11 or <= -10 likely exponential */ | ||||
| 	function large_exp(v/*:number*/)/*:string*/ { | ||||
| 		var o = strip_decimal(v.toFixed(11)); | ||||
| 		return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o; | ||||
| 	} | ||||
| 
 | ||||
| 	function general_fmt_num_base(v/*:number*/)/*:string*/ { | ||||
| 		var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o; | ||||
| 
 | ||||
| 		if(V >= -4 && V <= -1) o = v.toPrecision(10+V); | ||||
| 		else if(Math.abs(V) <= 9) o = small_exp(v); | ||||
| 		else if(V === 10) o = v.toFixed(10).substr(0,12); | ||||
| 		else o = large_exp(v); | ||||
| 
 | ||||
| 		return strip_decimal(normalize_exp(o.toUpperCase())); | ||||
| 	} | ||||
| 
 | ||||
| 	return general_fmt_num_base; | ||||
| })(); | ||||
| SSF._general_num = general_fmt_num; | ||||
| 
 | ||||
| /* | ||||
| 	"General" rules: | ||||
| 	- text is passed through ("@") | ||||
| 	- booleans are rendered as TRUE/FALSE | ||||
| 	- "up to 11 characters" displayed for numbers | ||||
| 	- Default date format (code 14) used for Dates | ||||
| 
 | ||||
| 	TODO: technically the display depends on the width of the cell | ||||
| */ | ||||
| function general_fmt(v/*:any*/, opts/*:any*/) { | ||||
| 	switch(typeof v) { | ||||
| 		case 'string': return v; | ||||
| 		case 'boolean': return v ? "TRUE" : "FALSE"; | ||||
| 		case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v); | ||||
| 		case 'undefined': return ""; | ||||
| 		case 'object': | ||||
| 			if(v == null) return ""; | ||||
| 			if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts); | ||||
| 	} | ||||
| 	throw new Error("unsupported value in General format: " + v); | ||||
| } | ||||
| SSF._general = general_fmt; | ||||
							
								
								
									
										7
									
								
								packages/ssf/bits/45_hijri.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										7
									
								
								packages/ssf/bits/45_hijri.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| function fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) { | ||||
|   /* TODO: properly adjust y/m/d and  */ | ||||
|   o[0] -= 581; | ||||
|   var dow = date.getDay(); | ||||
|   if(date < 60) dow = (dow + 6) % 7; | ||||
|   return dow; | ||||
| } | ||||
							
								
								
									
										1
									
								
								packages/ssf/bits/49_thaidigits.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								packages/ssf/bits/49_thaidigits.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split(""); | ||||
							
								
								
									
										66
									
								
								packages/ssf/bits/50_date.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										66
									
								
								packages/ssf/bits/50_date.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,66 @@ | ||||
| /*jshint -W086 */ | ||||
| function write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ { | ||||
| 	var o="", ss=0, tt=0, y = val.y, out, outl = 0; | ||||
| 	switch(type) { | ||||
| 		case 98: /* 'b' buddhist year */ | ||||
| 			y = val.y + 543; | ||||
| 			/* falls through */ | ||||
| 		case 121: /* 'y' year */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = y % 100; outl = 2; break; | ||||
| 			default: out = y % 10000; outl = 4; break; | ||||
| 		} break; | ||||
| 		case 109: /* 'm' month */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.m; outl = fmt.length; break; | ||||
| 			case 3: return months[val.m-1][1]; | ||||
| 			case 5: return months[val.m-1][0]; | ||||
| 			default: return months[val.m-1][2]; | ||||
| 		} break; | ||||
| 		case 100: /* 'd' day */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.d; outl = fmt.length; break; | ||||
| 			case 3: return days[val.q][0]; | ||||
| 			default: return days[val.q][1]; | ||||
| 		} break; | ||||
| 		case 104: /* 'h' 12-hour */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break; | ||||
| 			default: throw 'bad hour format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 72: /* 'H' 24-hour */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.H; outl = fmt.length; break; | ||||
| 			default: throw 'bad hour format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 77: /* 'M' minutes */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.M; outl = fmt.length; break; | ||||
| 			default: throw 'bad minute format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 115: /* 's' seconds */ | ||||
| 			if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt; | ||||
| 			if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length); | ||||
| 			/*::if(!ss0) ss0 = 0; */ | ||||
| 			if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100; | ||||
| 			else tt = ss0 === 1 ? 10 : 1; | ||||
| 			ss = Math.round((tt)*(val.S + val.u)); | ||||
| 			if(ss >= 60*tt) ss = 0; | ||||
| 			if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt; | ||||
| 			o = pad0(ss,2 + ss0); | ||||
| 			if(fmt === 'ss') return o.substr(0,2); | ||||
| 			return "." + o.substr(2,fmt.length-1); | ||||
| 		case 90: /* 'Z' absolute time */ | ||||
| 		switch(fmt) { | ||||
| 			case '[h]': case '[hh]': out = val.D*24+val.H; break; | ||||
| 			case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break; | ||||
| 			case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break; | ||||
| 			default: throw 'bad abstime format: ' + fmt; | ||||
| 		} outl = fmt.length === 3 ? 1 : 2; break; | ||||
| 		case 101: /* 'e' era */ | ||||
| 			out = y; outl = 1; break; | ||||
| 	} | ||||
| 	var outstr = outl > 0 ? pad0(out, outl) : ""; | ||||
| 	return outstr; | ||||
| } | ||||
| /*jshint +W086 */ | ||||
							
								
								
									
										7
									
								
								packages/ssf/bits/56_commaify.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										7
									
								
								packages/ssf/bits/56_commaify.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| function commaify(s/*:string*/)/*:string*/ { | ||||
| 	var w = 3; | ||||
| 	if(s.length <= w) return s; | ||||
| 	var j = (s.length % w), o = s.substr(0,j); | ||||
| 	for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w); | ||||
| 	return o; | ||||
| } | ||||
							
								
								
									
										1
									
								
								packages/ssf/bits/57_numhead.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								packages/ssf/bits/57_numhead.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| var write_num/*:SSF_write_num*/ = (function make_write_num(){ | ||||
							
								
								
									
										5
									
								
								packages/ssf/bits/59_numhelp.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										5
									
								
								packages/ssf/bits/59_numhelp.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| var pct1 = /%/g; | ||||
| function write_num_pct(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; | ||||
| 	return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); | ||||
| } | ||||
							
								
								
									
										69
									
								
								packages/ssf/bits/60_number.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										69
									
								
								packages/ssf/bits/60_number.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | ||||
| function write_num_cm(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var idx = fmt.length - 1; | ||||
| 	while(fmt.charCodeAt(idx-1) === 44) --idx; | ||||
| 	return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); | ||||
| } | ||||
| function write_num_exp(fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var o/*:string*/; | ||||
| 	var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; | ||||
| 	if(fmt.match(/^#+0.0E\+0$/)) { | ||||
| 		if(val == 0) return "0.0E+0"; | ||||
| 		else if(val < 0) return "-" + write_num_exp(fmt, -val); | ||||
| 		var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); | ||||
| 		var ee = Math.floor(Math.log(val)*Math.LOG10E)%period; | ||||
| 		if(ee < 0) ee += period; | ||||
| 		o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); | ||||
| 		if(o.indexOf("e") === -1) { | ||||
| 			var fakee = Math.floor(Math.log(val)*Math.LOG10E); | ||||
| 			if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee); | ||||
| 			else o += "E+" + (fakee - ee); | ||||
| 			while(o.substr(0,2) === "0.") { | ||||
| 				o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period); | ||||
| 				o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0."); | ||||
| 			} | ||||
| 			o = o.replace(/\+-/,"-"); | ||||
| 		} | ||||
| 		o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); | ||||
| 	} else o = val.toExponential(idx); | ||||
| 	if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1); | ||||
| 	if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | ||||
| 	return o.replace("e","E"); | ||||
| } | ||||
| var frac1 = /# (\?+)( ?)\/( ?)(\d+)/; | ||||
| function write_num_f1(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ { | ||||
| 	var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den); | ||||
| 	var myn = (rr - base*den), myd = den; | ||||
| 	return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length)); | ||||
| } | ||||
| function write_num_f2(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ { | ||||
| 	return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length); | ||||
| } | ||||
| var dec1 = /^#*0*\.([0#]+)/; | ||||
| var closeparen = /\).*[0#]/; | ||||
| var phone = /\(###\) ###\\?-####/; | ||||
| function hashq(str/*:string*/)/*:string*/ { | ||||
| 	var o = "", cc; | ||||
| 	for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) { | ||||
| 		case 35: break; | ||||
| 		case 63: o+= " "; break; | ||||
| 		case 48: o+= "0"; break; | ||||
| 		default: o+= String.fromCharCode(cc); | ||||
| 	} | ||||
| 	return o; | ||||
| } | ||||
| function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); } | ||||
| function dec(val/*:number*/, d/*:number*/)/*:number*/ { | ||||
| 	var _frac = val - Math.floor(val), dd = Math.pow(10,d); | ||||
| 	if (d < ('' + Math.round(_frac * dd)).length) return 0; | ||||
| 	return Math.round(_frac * dd); | ||||
| } | ||||
| function carry(val/*:number*/, d/*:number*/)/*:number*/ { | ||||
| 	if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) { | ||||
| 		return 1; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| function flr(val/*:number*/)/*:string*/ { | ||||
| 	if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0)); | ||||
| 	return ""+Math.floor(val); | ||||
| } | ||||
							
								
								
									
										85
									
								
								packages/ssf/bits/63_numflt.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										85
									
								
								packages/ssf/bits/63_numflt.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,85 @@ | ||||
| function write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ { | ||||
| 	if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { | ||||
| 		var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); | ||||
| 		if(val >= 0) return write_num_flt('n', ffmt, val); | ||||
| 		return '(' + write_num_flt('n', ffmt, -val) + ')'; | ||||
| 	} | ||||
| 	if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val); | ||||
| 	if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val); | ||||
| 	if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val); | ||||
| 	if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val); | ||||
| 	var o; | ||||
| 	var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; | ||||
| 	if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length); | ||||
| 	if(fmt.match(/^[#?]+$/)) { | ||||
| 		o = pad0r(val,0); if(o === "0") o = ""; | ||||
| 		return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign); | ||||
| 	if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0")); | ||||
| 	if((r = fmt.match(dec1))) { | ||||
| 		o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(/*::(*/r/*::||[""])*/[1]).length-$1.length); }); | ||||
| 		return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); | ||||
| 	} | ||||
| 	fmt = fmt.replace(/^#+([0.])/, "$1"); | ||||
| 	if((r = fmt.match(/^(0*)\.(#*)$/))) { | ||||
| 		return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0)); | ||||
| 	if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val); | ||||
| 	if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) { | ||||
| 		o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val)); | ||||
| 		ri = 0; | ||||
| 		return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";})); | ||||
| 	} | ||||
| 	if(fmt.match(phone)) { | ||||
| 		o = write_num_flt(type, "##########", val); | ||||
| 		return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6); | ||||
| 	} | ||||
| 	var oa = ""; | ||||
| 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(/*::String(*/r[4]/*::)*/.length,7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, false); | ||||
| 		o = "" + sign; | ||||
| 		oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]); | ||||
| 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0"; | ||||
| 		o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/; | ||||
| 		oa = rpad_(ff[2],ri); | ||||
| 		if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa; | ||||
| 		o += oa; | ||||
| 		return o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, true); | ||||
| 		return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^[#0?]+$/))) { | ||||
| 		o = pad0r(val, 0); | ||||
| 		if(fmt.length <= o.length) return o; | ||||
| 		return hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^([#0?]+)\.([#0]+)$/))) { | ||||
| 		o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1"); | ||||
| 		ri = o.indexOf("."); | ||||
| 		var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; | ||||
| 		return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^00,000\.([#0]*0)$/))) { | ||||
| 		ri = dec(val, r[1].length); | ||||
| 		return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length); | ||||
| 	} | ||||
| 	switch(fmt) { | ||||
| 		case "###,##0.00": return write_num_flt(type, "#,##0.00", val); | ||||
| 		case "###,###": | ||||
| 		case "##,###": | ||||
| 		case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : ""; | ||||
| 		case "###,###.00": return write_num_flt(type, "###,##0.00",val).replace(/^0\./,"."); | ||||
| 		case "#,###.00": return write_num_flt(type, "#,##0.00",val).replace(/^0\./,"."); | ||||
| 		default: | ||||
| 	} | ||||
| 	throw new Error("unsupported format |" + fmt + "|"); | ||||
| } | ||||
							
								
								
									
										31
									
								
								packages/ssf/bits/65_numinth.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										31
									
								
								packages/ssf/bits/65_numinth.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| function write_num_cm2(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var idx = fmt.length - 1; | ||||
| 	while(fmt.charCodeAt(idx-1) === 44) --idx; | ||||
| 	return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); | ||||
| } | ||||
| function write_num_pct2(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; | ||||
| 	return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); | ||||
| } | ||||
| function write_num_exp2(fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var o/*:string*/; | ||||
| 	var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; | ||||
| 	if(fmt.match(/^#+0.0E\+0$/)) { | ||||
| 		if(val == 0) return "0.0E+0"; | ||||
| 		else if(val < 0) return "-" + write_num_exp2(fmt, -val); | ||||
| 		var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); | ||||
| 		var ee = Math.floor(Math.log(val)*Math.LOG10E)%period; | ||||
| 		if(ee < 0) ee += period; | ||||
| 		o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); | ||||
| 		if(!o.match(/[Ee]/)) { | ||||
| 			var fakee = Math.floor(Math.log(val)*Math.LOG10E); | ||||
| 			if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee); | ||||
| 			else o += "E+" + (fakee - ee); | ||||
| 			o = o.replace(/\+-/,"-"); | ||||
| 		} | ||||
| 		o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); | ||||
| 	} else o = val.toExponential(idx); | ||||
| 	if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1); | ||||
| 	if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | ||||
| 	return o.replace("e","E"); | ||||
| } | ||||
							
								
								
									
										86
									
								
								packages/ssf/bits/66_numint.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										86
									
								
								packages/ssf/bits/66_numint.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | ||||
| function write_num_int(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ { | ||||
| 	if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { | ||||
| 		var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); | ||||
| 		if(val >= 0) return write_num_int('n', ffmt, val); | ||||
| 		return '(' + write_num_int('n', ffmt, -val) + ')'; | ||||
| 	} | ||||
| 	if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val); | ||||
| 	if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val); | ||||
| 	if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val); | ||||
| 	if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val); | ||||
| 	var o; | ||||
| 	var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; | ||||
| 	if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length); | ||||
| 	if(fmt.match(/^[#?]+$/)) { | ||||
| 		o = (""+val); if(val === 0) o = ""; | ||||
| 		return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign); | ||||
| 	if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0")); | ||||
| 	if((r = fmt.match(dec1))) { | ||||
| 		/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */ | ||||
| 		o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])); | ||||
| 		o = o.replace(/\.(\d*)$/,function($$, $1) { | ||||
| 		/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */ | ||||
| 			return "." + $1 + fill("0", hashq(r[1]).length-$1.length); }); | ||||
| 		return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); | ||||
| 	} | ||||
| 	fmt = fmt.replace(/^#+([0.])/, "$1"); | ||||
| 	if((r = fmt.match(/^(0*)\.(#*)$/))) { | ||||
| 		return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval)); | ||||
| 	if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val); | ||||
| 	if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) { | ||||
| 		o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val)); | ||||
| 		ri = 0; | ||||
| 		return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";})); | ||||
| 	} | ||||
| 	if(fmt.match(phone)) { | ||||
| 		o = write_num_int(type, "##########", val); | ||||
| 		return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6); | ||||
| 	} | ||||
| 	var oa = ""; | ||||
| 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(/*::String(*/r[4]/*::)*/.length,7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, false); | ||||
| 		o = "" + sign; | ||||
| 		oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]); | ||||
| 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0"; | ||||
| 		o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/; | ||||
| 		oa = rpad_(ff[2],ri); | ||||
| 		if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa; | ||||
| 		o += oa; | ||||
| 		return o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, true); | ||||
| 		return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^[#0?]+$/))) { | ||||
| 		o = "" + val; | ||||
| 		if(fmt.length <= o.length) return o; | ||||
| 		return hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) { | ||||
| 		o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1"); | ||||
| 		ri = o.indexOf("."); | ||||
| 		var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; | ||||
| 		return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^00,000\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length); | ||||
| 	} | ||||
| 	switch(fmt) { | ||||
| 		case "###,###": | ||||
| 		case "##,###": | ||||
| 		case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : ""; | ||||
| 		default: | ||||
| 			if(fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0,fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf("."))); | ||||
| 	} | ||||
| 	throw new Error("unsupported format |" + fmt + "|"); | ||||
| } | ||||
							
								
								
									
										3
									
								
								packages/ssf/bits/69_numfoot.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								packages/ssf/bits/69_numfoot.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| return function write_num(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ { | ||||
| 	return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val); | ||||
| };})(); | ||||
							
								
								
									
										17
									
								
								packages/ssf/bits/80_split.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										17
									
								
								packages/ssf/bits/80_split.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| function split_fmt(fmt/*:string*/)/*:Array<string>*/ { | ||||
| 	var out/*:Array<string>*/ = []; | ||||
| 	var in_str = false/*, cc*/; | ||||
| 	for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) { | ||||
| 		case 34: /* '"' */ | ||||
| 			in_str = !in_str; break; | ||||
| 		case 95: case 42: case 92: /* '_' '*' '\\' */ | ||||
| 			++i; break; | ||||
| 		case 59: /* ';' */ | ||||
| 			out[out.length] = fmt.substr(j,i-j); | ||||
| 			j = i+1; | ||||
| 	} | ||||
| 	out[out.length] = fmt.substr(j); | ||||
| 	if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string "); | ||||
| 	return out; | ||||
| } | ||||
| SSF._split = split_fmt; | ||||
							
								
								
									
										43
									
								
								packages/ssf/bits/81_fmttype.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										43
									
								
								packages/ssf/bits/81_fmttype.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | ||||
| var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/; | ||||
| function fmt_is_date(fmt/*:string*/)/*:boolean*/ { | ||||
| 	var i = 0, /*cc = 0,*/ c = "", o = ""; | ||||
| 	while(i < fmt.length) { | ||||
| 		switch((c = fmt.charAt(i))) { | ||||
| 			case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break; | ||||
| 			case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break; | ||||
| 			case '\\': i+=2; break; | ||||
| 			case '_': i+=2; break; | ||||
| 			case '@': ++i; break; | ||||
| 			case 'B': case 'b': | ||||
| 				if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true; | ||||
| 				/* falls through */ | ||||
| 			case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | ||||
| 				/* falls through */ | ||||
| 			case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true; | ||||
| 			case 'A': case 'a': case '上': | ||||
| 				if(fmt.substr(i, 3).toUpperCase() === "A/P") return true; | ||||
| 				if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true; | ||||
| 				if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true; | ||||
| 				++i; break; | ||||
| 			case '[': | ||||
| 				o = c; | ||||
| 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i); | ||||
| 				if(o.match(abstime)) return true; | ||||
| 				break; | ||||
| 			case '.': | ||||
| 				/* falls through */ | ||||
| 			case '0': case '#': | ||||
| 				while(i < fmt.length && ("0#?.,E+-%".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\' && fmt.charAt(i+1) == "-" && "0#".indexOf(fmt.charAt(i+2))>-1))){/* empty */} | ||||
| 				break; | ||||
| 			case '?': while(fmt.charAt(++i) === c){/* empty */} break; | ||||
| 			case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; | ||||
| 			case '(': case ')': ++i; break; | ||||
| 			case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': | ||||
| 				while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break; | ||||
| 			case ' ': ++i; break; | ||||
| 			default: ++i; break; | ||||
| 		} | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| SSF.is_date = fmt_is_date; | ||||
							
								
								
									
										208
									
								
								packages/ssf/bits/82_eval.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										208
									
								
								packages/ssf/bits/82_eval.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,208 @@ | ||||
| function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) { | ||||
| 	var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc; | ||||
| 	var hr='H'; | ||||
| 	/* Tokenize */ | ||||
| 	while(i < fmt.length) { | ||||
| 		switch((c = fmt.charAt(i))) { | ||||
| 			case 'G': /* General */ | ||||
| 				if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt); | ||||
| 				out[out.length] = {t:'G', v:'General'}; i+=7; break; | ||||
| 			case '"': /* Literal text */ | ||||
| 				for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc); | ||||
| 				out[out.length] = {t:'t', v:o}; ++i; break; | ||||
| 			case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't'; | ||||
| 				out[out.length] = {t:t, v:w}; ++i; break; | ||||
| 			case '_': out[out.length] = {t:'t', v:" "}; i+=2; break; | ||||
| 			case '@': /* Text Placeholder */ | ||||
| 				out[out.length] = {t:'T', v:v}; ++i; break; | ||||
| 			case 'B': case 'b': | ||||
| 				if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") { | ||||
| 					if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; } | ||||
| 					out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break; | ||||
| 				} | ||||
| 				/* falls through */ | ||||
| 			case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | ||||
| 				c = c.toLowerCase(); | ||||
| 				/* falls through */ | ||||
| 			case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': | ||||
| 				if(v < 0) return ""; | ||||
| 				if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; } | ||||
| 				o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c; | ||||
| 				if(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; | ||||
| 				if(c === 'h') c = hr; | ||||
| 				out[out.length] = {t:c, v:o}; lst = c; break; | ||||
| 			case 'A': case 'a': case '上': | ||||
| 				var q={t:c, v:c}; | ||||
| 				if(dt==null) dt=parse_date_code(v, opts); | ||||
| 				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} | ||||
| 				else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } | ||||
| 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; } | ||||
| 				else { q.t = "t"; ++i; } | ||||
| 				if(dt==null && q.t === 'T') return ""; | ||||
| 				out[out.length] = q; lst = c; break; | ||||
| 			case '[': | ||||
| 				o = c; | ||||
| 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i); | ||||
| 				if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|'; | ||||
| 				if(o.match(abstime)) { | ||||
| 					if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; } | ||||
| 					out[out.length] = {t:'Z', v:o.toLowerCase()}; | ||||
| 					lst = o.charAt(1); | ||||
| 				} else if(o.indexOf("$") > -1) { | ||||
| 					o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$"; | ||||
| 					if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o}; | ||||
| 				} | ||||
| 				break; | ||||
| 			/* Numbers */ | ||||
| 			case '.': | ||||
| 				if(dt != null) { | ||||
| 					o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c; | ||||
| 					out[out.length] = {t:'s', v:o}; break; | ||||
| 				} | ||||
| 				/* falls through */ | ||||
| 			case '0': case '#': | ||||
| 				o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c; | ||||
| 				out[out.length] = {t:'n', v:o}; break; | ||||
| 			case '?': | ||||
| 				o = c; while(fmt.charAt(++i) === c) o+=c; | ||||
| 				out[out.length] = {t:c, v:o}; lst = c; break; | ||||
| 			case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **
 | ||||
| 			case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break; | ||||
| 			case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': | ||||
| 				o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i); | ||||
| 				out[out.length] = {t:'D', v:o}; break; | ||||
| 			case ' ': out[out.length] = {t:c, v:c}; ++i; break; | ||||
| 			case '$': out[out.length] = {t:'t', v:'$'}; ++i; break; | ||||
| 			default: | ||||
| 				if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt); | ||||
| 				out[out.length] = {t:'t', v:c}; ++i; break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Scan for date/time parts */ | ||||
| 	var bt = 0, ss0 = 0, ssm; | ||||
| 	for(i=out.length-1, lst='t'; i >= 0; --i) { | ||||
| 		switch(out[i].t) { | ||||
| 			case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break; | ||||
| 			case 's': | ||||
| 				if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1); | ||||
| 				if(bt < 3) bt = 3; | ||||
| 			/* falls through */ | ||||
| 			case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break; | ||||
| 			case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break; | ||||
| 			case 'X': /*if(out[i].v === "B2");*/ | ||||
| 				break; | ||||
| 			case 'Z': | ||||
| 				if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1; | ||||
| 				if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2; | ||||
| 				if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3; | ||||
| 		} | ||||
| 	} | ||||
| 	/* time rounding depends on presence of minute / second / usec fields */ | ||||
| 	switch(bt) { | ||||
| 		case 0: break; | ||||
| 		case 1: | ||||
| 			/*::if(!dt) break;*/ | ||||
| 			if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } | ||||
| 			if(dt.S >=  60) { dt.S = 0; ++dt.M; } | ||||
| 			if(dt.M >=  60) { dt.M = 0; ++dt.H; } | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			/*::if(!dt) break;*/ | ||||
| 			if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } | ||||
| 			if(dt.S >=  60) { dt.S = 0; ++dt.M; } | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* replace fields */ | ||||
| 	var nstr = "", jj; | ||||
| 	for(i=0; i < out.length; ++i) { | ||||
| 		switch(out[i].t) { | ||||
| 			case 't': case 'T': case ' ': case 'D': break; | ||||
| 			case 'X': out[i].v = ""; out[i].t = ";"; break; | ||||
| 			case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z': | ||||
| 				/*::if(!dt) throw "unreachable"; */ | ||||
| 				out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0); | ||||
| 				out[i].t = 't'; break; | ||||
| 			case 'n': case '?': | ||||
| 				jj = i+1; | ||||
| 				while(out[jj] != null && ( | ||||
| 					(c=out[jj].t) === "?" || c === "D" || | ||||
| 					((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) || | ||||
| 					(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) || | ||||
| 					(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?')) | ||||
| 				)) { | ||||
| 					out[i].v += out[jj].v; | ||||
| 					out[jj] = {v:"", t:";"}; ++jj; | ||||
| 				} | ||||
| 				nstr += out[i].v; | ||||
| 				i = jj-1; break; | ||||
| 			case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break; | ||||
| 		} | ||||
| 	} | ||||
| 	var vv = "", myv, ostr; | ||||
| 	if(nstr.length > 0) { | ||||
| 		if(nstr.charCodeAt(0) == 40) /* '(' */ { | ||||
| 			myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); | ||||
| 			ostr = write_num('n', nstr, myv); | ||||
| 		} else { | ||||
| 			myv = (v<0 && flen > 1 ? -v : v); | ||||
| 			ostr = write_num('n', nstr, myv); | ||||
| 			if(myv < 0 && out[0] && out[0].t == 't') { | ||||
| 				ostr = ostr.substr(1); | ||||
| 				out[0].v = "-" + out[0].v; | ||||
| 			} | ||||
| 		} | ||||
| 		jj=ostr.length-1; | ||||
| 		var decpt = out.length; | ||||
| 		for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; } | ||||
| 		var lasti=out.length; | ||||
| 		if(decpt === out.length && ostr.indexOf("E") === -1) { | ||||
| 			for(i=out.length-1; i>= 0;--i) { | ||||
| 				if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue; | ||||
| 				if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); } | ||||
| 				else if(jj < 0) out[i].v = ""; | ||||
| 				else { out[i].v = ostr.substr(0, jj+1); jj = -1; } | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 			if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v; | ||||
| 		} | ||||
| 		else if(decpt !== out.length && ostr.indexOf("E") === -1) { | ||||
| 			jj = ostr.indexOf(".")-1; | ||||
| 			for(i=decpt; i>= 0; --i) { | ||||
| 				if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue; | ||||
| 				j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1; | ||||
| 				vv = out[i].v.substr(j+1); | ||||
| 				for(; j>=0; --j) { | ||||
| 					if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv; | ||||
| 				} | ||||
| 				out[i].v = vv; | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 			if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v; | ||||
| 			jj = ostr.indexOf(".")+1; | ||||
| 			for(i=decpt; i<out.length; ++i) { | ||||
| 				if(out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue; | ||||
| 				j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0; | ||||
| 				vv = out[i].v.substr(0,j); | ||||
| 				for(; j<out[i].v.length; ++j) { | ||||
| 					if(jj<ostr.length) vv += ostr.charAt(jj++); | ||||
| 				} | ||||
| 				out[i].v = vv; | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	for(i=0; i<out.length; ++i) if(out[i] != null && 'n?'.indexOf(out[i].t)>-1) { | ||||
| 		myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v); | ||||
| 		out[i].v = write_num(out[i].t, out[i].v, myv); | ||||
| 		out[i].t = 't'; | ||||
| 	} | ||||
| 	var retval = ""; | ||||
| 	for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v; | ||||
| 	return retval; | ||||
| } | ||||
| SSF._eval = eval_fmt; | ||||
							
								
								
									
										15
									
								
								packages/ssf/bits/88_cond.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								packages/ssf/bits/88_cond.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| var cfregex = /\[[=<>]/; | ||||
| var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/; | ||||
| function chkcond(v, rr) { | ||||
| 	if(rr == null) return false; | ||||
| 	var thresh = parseFloat(rr[2]); | ||||
| 	switch(rr[1]) { | ||||
| 		case "=":  if(v == thresh) return true; break; | ||||
| 		case ">":  if(v >  thresh) return true; break; | ||||
| 		case "<":  if(v <  thresh) return true; break; | ||||
| 		case "<>": if(v != thresh) return true; break; | ||||
| 		case ">=": if(v >= thresh) return true; break; | ||||
| 		case "<=": if(v <= thresh) return true; break; | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
							
								
								
									
										44
									
								
								packages/ssf/bits/90_main.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										44
									
								
								packages/ssf/bits/90_main.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | ||||
| function choose_fmt(f/*:string*/, v/*:any*/) { | ||||
| 	var fmt = split_fmt(f); | ||||
| 	var l = fmt.length, lat = fmt[l-1].indexOf("@"); | ||||
| 	if(l<4 && lat>-1) --l; | ||||
| 	if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|"); | ||||
| 	if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"]; | ||||
| 	switch(fmt.length) { | ||||
| 		case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break; | ||||
| 		case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break; | ||||
| 		case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break; | ||||
| 		case 4: break; | ||||
| 	} | ||||
| 	var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2]; | ||||
| 	if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff]; | ||||
| 	if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) { | ||||
| 		var m1 = fmt[0].match(cfregex2); | ||||
| 		var m2 = fmt[1].match(cfregex2); | ||||
| 		return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]]; | ||||
| 	} | ||||
| 	return [l, ff]; | ||||
| } | ||||
| function format(fmt/*:string|number*/,v/*:any*/,o/*:?any*/) { | ||||
| 	if(o == null) o = {}; | ||||
| 	var sfmt = ""; | ||||
| 	switch(typeof fmt) { | ||||
| 		case "string": | ||||
| 			if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF; | ||||
| 			else sfmt = fmt; | ||||
| 			break; | ||||
| 		case "number": | ||||
| 			if(fmt == 14 && o.dateNF) sfmt = o.dateNF; | ||||
| 			else sfmt = (o.table != null ? (o.table/*:any*/) : table_fmt)[fmt]; | ||||
| 			if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]]; | ||||
| 			if(sfmt == null) sfmt = default_str[fmt] || "General"; | ||||
| 			break; | ||||
| 	} | ||||
| 	if(isgeneral(sfmt,0)) return general_fmt(v, o); | ||||
| 	if(v instanceof Date) v = datenum_local(v, o.date1904); | ||||
| 	var f = choose_fmt(sfmt, v); | ||||
| 	if(isgeneral(f[1])) return general_fmt(v, o); | ||||
| 	if(v === true) v = "TRUE"; else if(v === false) v = "FALSE"; | ||||
| 	else if(v === "" || v == null) return ""; | ||||
| 	return eval_fmt(f[1], v, o, f[0]); | ||||
| } | ||||
							
								
								
									
										17
									
								
								packages/ssf/bits/95_load.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										17
									
								
								packages/ssf/bits/95_load.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| function load_entry(fmt/*:string*/, idx/*:?number*/)/*:number*/ { | ||||
| 	if(typeof idx != 'number') { | ||||
| 		idx = +idx || -1; | ||||
| /*::if(typeof idx != 'number') return 0x188; */ | ||||
| 		for(var i = 0; i < 0x0188; ++i) { | ||||
| /*::if(typeof idx != 'number') return 0x188; */ | ||||
| 			if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; } | ||||
| 			if(table_fmt[i] == fmt) { idx = i; break; } | ||||
| 		} | ||||
| /*::if(typeof idx != 'number') return 0x188; */ | ||||
| 		if(idx < 0) idx = 0x187; | ||||
| 	} | ||||
| /*::if(typeof idx != 'number') return 0x188; */ | ||||
| 	table_fmt[idx] = fmt; | ||||
| 	return idx; | ||||
| } | ||||
| SSF.load = load_entry; | ||||
							
								
								
									
										8
									
								
								packages/ssf/bits/98_exports.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										8
									
								
								packages/ssf/bits/98_exports.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| SSF._table = table_fmt; | ||||
| SSF.get_table = function get_table()/*:SSFTable*/ { return table_fmt; }; | ||||
| SSF.load_table = function load_table(tbl/*:SSFTable*/)/*:void*/ { | ||||
| 	for(var i=0; i!=0x0188; ++i) | ||||
| 		if(tbl[i] !== undefined) load_entry(tbl[i], i); | ||||
| }; | ||||
| SSF.init_table = init_table; | ||||
| SSF.format = format; | ||||
							
								
								
									
										4
									
								
								packages/ssf/bits/99_footer.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								packages/ssf/bits/99_footer.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| }; | ||||
| make_ssf(SSF); | ||||
| /*global module */ | ||||
| if(typeof module !== 'undefined' && typeof DO_NOT_EXPORT_SSF === 'undefined') module.exports = SSF; | ||||
							
								
								
									
										33
									
								
								packages/ssf/ctest/index.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										33
									
								
								packages/ssf/ctest/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <head> | ||||
|     <title>SSF Test Runner</title> | ||||
|     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <link rel="stylesheet" href="mocha.css" /> | ||||
|     <link rel="icon" type="image/png" href="//oss.sheetjs.com/assets/img/logo.png" /> | ||||
|     <style> | ||||
|       #t { font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; font-weight: bold; } | ||||
|       #tt{ font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; } | ||||
|       th { font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; font-weight: bold; text-align: left; } | ||||
|     </style> | ||||
|   </head> | ||||
|   <body> | ||||
|     <h1 id="t">SSF Tests</h1> | ||||
|     <div id="mocha"></div> | ||||
|     <script src="shim.js"></script> | ||||
| 		<script src="json2.js"></script> | ||||
|     <script src="mocha.js"></script> | ||||
|     <script> | ||||
|       window.initMochaPhantomJS && window.initMochaPhantomJS(); | ||||
|       mocha.setup('bdd'); | ||||
|     </script> | ||||
|     <script src="test.js"></script> | ||||
|     <script> | ||||
|       if(typeof mochaSaucePlease !== "undefined") mochaSaucePlease(); | ||||
|       else if(window.mochaPhantomJS) mochaPhantomJS.run(); | ||||
|       else mocha.run(); | ||||
|     </script> | ||||
|   </body> | ||||
| </html> | ||||
| 
 | ||||
							
								
								
									
										489
									
								
								packages/ssf/ctest/json2.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										489
									
								
								packages/ssf/ctest/json2.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,489 @@ | ||||
| /* | ||||
|     json2.js | ||||
|     2014-02-04 | ||||
| 
 | ||||
|     Public Domain. | ||||
| 
 | ||||
|     NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. | ||||
| 
 | ||||
|     See http://www.JSON.org/js.html
 | ||||
| 
 | ||||
| 
 | ||||
|     This code should be minified before deployment. | ||||
|     See http://javascript.crockford.com/jsmin.html
 | ||||
| 
 | ||||
|     USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO | ||||
|     NOT CONTROL. | ||||
| 
 | ||||
| 
 | ||||
|     This file creates a global JSON object containing two methods: stringify | ||||
|     and parse. | ||||
| 
 | ||||
|         JSON.stringify(value, replacer, space) | ||||
|             value       any JavaScript value, usually an object or array. | ||||
| 
 | ||||
|             replacer    an optional parameter that determines how object | ||||
|                         values are stringified for objects. It can be a | ||||
|                         function or an array of strings. | ||||
| 
 | ||||
|             space       an optional parameter that specifies the indentation | ||||
|                         of nested structures. If it is omitted, the text will | ||||
|                         be packed without extra whitespace. If it is a number, | ||||
|                         it will specify the number of spaces to indent at each | ||||
|                         level. If it is a string (such as '\t' or ' '), | ||||
|                         it contains the characters used to indent at each level. | ||||
| 
 | ||||
|             This method produces a JSON text from a JavaScript value. | ||||
| 
 | ||||
|             When an object value is found, if the object contains a toJSON | ||||
|             method, its toJSON method will be called and the result will be | ||||
|             stringified. A toJSON method does not serialize: it returns the | ||||
|             value represented by the name/value pair that should be serialized, | ||||
|             or undefined if nothing should be serialized. The toJSON method | ||||
|             will be passed the key associated with the value, and this will be | ||||
|             bound to the value | ||||
| 
 | ||||
|             For example, this would serialize Dates as ISO strings. | ||||
| 
 | ||||
|                 Date.prototype.toJSON = function (key) { | ||||
|                     function f(n) { | ||||
|                         // Format integers to have at least two digits.
 | ||||
|                         return n < 10 ? '0' + n : n; | ||||
|                     } | ||||
| 
 | ||||
|                     return this.getUTCFullYear()   + '-' + | ||||
|                          f(this.getUTCMonth() + 1) + '-' + | ||||
|                          f(this.getUTCDate())      + 'T' + | ||||
|                          f(this.getUTCHours())     + ':' + | ||||
|                          f(this.getUTCMinutes())   + ':' + | ||||
|                          f(this.getUTCSeconds())   + 'Z'; | ||||
|                 }; | ||||
| 
 | ||||
|             You can provide an optional replacer method. It will be passed the | ||||
|             key and value of each member, with this bound to the containing | ||||
|             object. The value that is returned from your method will be | ||||
|             serialized. If your method returns undefined, then the member will | ||||
|             be excluded from the serialization. | ||||
| 
 | ||||
|             If the replacer parameter is an array of strings, then it will be | ||||
|             used to select the members to be serialized. It filters the results | ||||
|             such that only members with keys listed in the replacer array are | ||||
|             stringified. | ||||
| 
 | ||||
|             Values that do not have JSON representations, such as undefined or | ||||
|             functions, will not be serialized. Such values in objects will be | ||||
|             dropped; in arrays they will be replaced with null. You can use | ||||
|             a replacer function to replace those with JSON values. | ||||
|             JSON.stringify(undefined) returns undefined. | ||||
| 
 | ||||
|             The optional space parameter produces a stringification of the | ||||
|             value that is filled with line breaks and indentation to make it | ||||
|             easier to read. | ||||
| 
 | ||||
|             If the space parameter is a non-empty string, then that string will | ||||
|             be used for indentation. If the space parameter is a number, then | ||||
|             the indentation will be that many spaces. | ||||
| 
 | ||||
|             Example: | ||||
| 
 | ||||
|             text = JSON.stringify(['e', {pluribus: 'unum'}]); | ||||
|             // text is '["e",{"pluribus":"unum"}]'
 | ||||
| 
 | ||||
| 
 | ||||
|             text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); | ||||
|             // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
 | ||||
| 
 | ||||
|             text = JSON.stringify([new Date()], function (key, value) { | ||||
|                 return this[key] instanceof Date ? | ||||
|                     'Date(' + this[key] + ')' : value; | ||||
|             }); | ||||
|             // text is '["Date(---current time---)"]'
 | ||||
| 
 | ||||
| 
 | ||||
|         JSON.parse(text, reviver) | ||||
|             This method parses a JSON text to produce an object or array. | ||||
|             It can throw a SyntaxError exception. | ||||
| 
 | ||||
|             The optional reviver parameter is a function that can filter and | ||||
|             transform the results. It receives each of the keys and values, | ||||
|             and its return value is used instead of the original value. | ||||
|             If it returns what it received, then the structure is not modified. | ||||
|             If it returns undefined then the member is deleted. | ||||
| 
 | ||||
|             Example: | ||||
| 
 | ||||
|             // Parse the text. Values that look like ISO date strings will
 | ||||
|             // be converted to Date objects.
 | ||||
| 
 | ||||
|             myData = JSON.parse(text, function (key, value) { | ||||
|                 var a; | ||||
|                 if (typeof value === 'string') { | ||||
|                     a = | ||||
| /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); | ||||
|                     if (a) { | ||||
|                         return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], | ||||
|                             +a[5], +a[6])); | ||||
|                     } | ||||
|                 } | ||||
|                 return value; | ||||
|             }); | ||||
| 
 | ||||
|             myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { | ||||
|                 var d; | ||||
|                 if (typeof value === 'string' && | ||||
|                         value.slice(0, 5) === 'Date(' && | ||||
|                         value.slice(-1) === ')') { | ||||
|                     d = new Date(value.slice(5, -1)); | ||||
|                     if (d) { | ||||
|                         return d; | ||||
|                     } | ||||
|                 } | ||||
|                 return value; | ||||
|             }); | ||||
| 
 | ||||
| 
 | ||||
|     This is a reference implementation. You are free to copy, modify, or | ||||
|     redistribute. | ||||
| */ | ||||
| 
 | ||||
| /*jslint evil: true, regexp: true */ | ||||
| 
 | ||||
| /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, | ||||
|     call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, | ||||
|     getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, | ||||
|     lastIndex, length, parse, prototype, push, replace, slice, stringify, | ||||
|     test, toJSON, toString, valueOf | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| // Create a JSON object only if one does not already exist. We create the
 | ||||
| // methods in a closure to avoid creating global variables.
 | ||||
| 
 | ||||
| if (typeof JSON !== 'object') { | ||||
|     JSON = {}; | ||||
| } | ||||
| 
 | ||||
| (function () { | ||||
|     'use strict'; | ||||
| 
 | ||||
|     function f(n) { | ||||
|         // Format integers to have at least two digits.
 | ||||
|         return n < 10 ? '0' + n : n; | ||||
|     } | ||||
| 
 | ||||
|     if (typeof Date.prototype.toJSON !== 'function') { | ||||
| 
 | ||||
|         Date.prototype.toJSON = function () { | ||||
| 
 | ||||
|             return isFinite(this.valueOf()) | ||||
|                 ? this.getUTCFullYear()     + '-' + | ||||
|                     f(this.getUTCMonth() + 1) + '-' + | ||||
|                     f(this.getUTCDate())      + 'T' + | ||||
|                     f(this.getUTCHours())     + ':' + | ||||
|                     f(this.getUTCMinutes())   + ':' + | ||||
|                     f(this.getUTCSeconds())   + 'Z' | ||||
|                 : null; | ||||
|         }; | ||||
| 
 | ||||
|         String.prototype.toJSON      = | ||||
|             Number.prototype.toJSON  = | ||||
|             Boolean.prototype.toJSON = function () { | ||||
|                 return this.valueOf(); | ||||
|             }; | ||||
|     } | ||||
| 
 | ||||
|     var cx, | ||||
|         escapable, | ||||
|         gap, | ||||
|         indent, | ||||
|         meta, | ||||
|         rep; | ||||
| 
 | ||||
| 
 | ||||
|     function quote(string) { | ||||
| 
 | ||||
| // If the string contains no control characters, no quote characters, and no
 | ||||
| // backslash characters, then we can safely slap some quotes around it.
 | ||||
| // Otherwise we must also replace the offending characters with safe escape
 | ||||
| // sequences.
 | ||||
| 
 | ||||
|         escapable.lastIndex = 0; | ||||
|         return escapable.test(string) ? '"' + string.replace(escapable, function (a) { | ||||
|             var c = meta[a]; | ||||
|             return typeof c === 'string' | ||||
|                 ? c | ||||
|                 : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); | ||||
|         }) + '"' : '"' + string + '"'; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     function str(key, holder) { | ||||
| 
 | ||||
| // Produce a string from holder[key].
 | ||||
| 
 | ||||
|         var i,          // The loop counter.
 | ||||
|             k,          // The member key.
 | ||||
|             v,          // The member value.
 | ||||
|             length, | ||||
|             mind = gap, | ||||
|             partial, | ||||
|             value = holder[key]; | ||||
| 
 | ||||
| // If the value has a toJSON method, call it to obtain a replacement value.
 | ||||
| 
 | ||||
|         if (value && typeof value === 'object' && | ||||
|                 typeof value.toJSON === 'function') { | ||||
|             value = value.toJSON(key); | ||||
|         } | ||||
| 
 | ||||
| // If we were called with a replacer function, then call the replacer to
 | ||||
| // obtain a replacement value.
 | ||||
| 
 | ||||
|         if (typeof rep === 'function') { | ||||
|             value = rep.call(holder, key, value); | ||||
|         } | ||||
| 
 | ||||
| // What happens next depends on the value's type.
 | ||||
| 
 | ||||
|         switch (typeof value) { | ||||
|         case 'string': | ||||
|             return quote(value); | ||||
| 
 | ||||
|         case 'number': | ||||
| 
 | ||||
| // JSON numbers must be finite. Encode non-finite numbers as null.
 | ||||
| 
 | ||||
|             return isFinite(value) ? String(value) : 'null'; | ||||
| 
 | ||||
|         case 'boolean': | ||||
|         case 'null': | ||||
| 
 | ||||
| // If the value is a boolean or null, convert it to a string. Note:
 | ||||
| // typeof null does not produce 'null'. The case is included here in
 | ||||
| // the remote chance that this gets fixed someday.
 | ||||
| 
 | ||||
|             return String(value); | ||||
| 
 | ||||
| // If the type is 'object', we might be dealing with an object or an array or
 | ||||
| // null.
 | ||||
| 
 | ||||
|         case 'object': | ||||
| 
 | ||||
| // Due to a specification blunder in ECMAScript, typeof null is 'object',
 | ||||
| // so watch out for that case.
 | ||||
| 
 | ||||
|             if (!value) { | ||||
|                 return 'null'; | ||||
|             } | ||||
| 
 | ||||
| // Make an array to hold the partial results of stringifying this object value.
 | ||||
| 
 | ||||
|             gap += indent; | ||||
|             partial = []; | ||||
| 
 | ||||
| // Is the value an array?
 | ||||
| 
 | ||||
|             if (Object.prototype.toString.apply(value) === '[object Array]') { | ||||
| 
 | ||||
| // The value is an array. Stringify every element. Use null as a placeholder
 | ||||
| // for non-JSON values.
 | ||||
| 
 | ||||
|                 length = value.length; | ||||
|                 for (i = 0; i < length; i += 1) { | ||||
|                     partial[i] = str(i, value) || 'null'; | ||||
|                 } | ||||
| 
 | ||||
| // Join all of the elements together, separated with commas, and wrap them in
 | ||||
| // brackets.
 | ||||
| 
 | ||||
|                 v = partial.length === 0 | ||||
|                     ? '[]' | ||||
|                     : gap | ||||
|                     ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' | ||||
|                     : '[' + partial.join(',') + ']'; | ||||
|                 gap = mind; | ||||
|                 return v; | ||||
|             } | ||||
| 
 | ||||
| // If the replacer is an array, use it to select the members to be stringified.
 | ||||
| 
 | ||||
|             if (rep && typeof rep === 'object') { | ||||
|                 length = rep.length; | ||||
|                 for (i = 0; i < length; i += 1) { | ||||
|                     if (typeof rep[i] === 'string') { | ||||
|                         k = rep[i]; | ||||
|                         v = str(k, value); | ||||
|                         if (v) { | ||||
|                             partial.push(quote(k) + (gap ? ': ' : ':') + v); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
| 
 | ||||
| // Otherwise, iterate through all of the keys in the object.
 | ||||
| 
 | ||||
|                 for (k in value) { | ||||
|                     if (Object.prototype.hasOwnProperty.call(value, k)) { | ||||
|                         v = str(k, value); | ||||
|                         if (v) { | ||||
|                             partial.push(quote(k) + (gap ? ': ' : ':') + v); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
| // Join all of the member texts together, separated with commas,
 | ||||
| // and wrap them in braces.
 | ||||
| 
 | ||||
|             v = partial.length === 0 | ||||
|                 ? '{}' | ||||
|                 : gap | ||||
|                 ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' | ||||
|                 : '{' + partial.join(',') + '}'; | ||||
|             gap = mind; | ||||
|             return v; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| // If the JSON object does not yet have a stringify method, give it one.
 | ||||
| 
 | ||||
|     if (typeof JSON.stringify !== 'function') { | ||||
|         escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; | ||||
|         meta = {    // table of character substitutions
 | ||||
|             '\b': '\\b', | ||||
|             '\t': '\\t', | ||||
|             '\n': '\\n', | ||||
|             '\f': '\\f', | ||||
|             '\r': '\\r', | ||||
|             '"' : '\\"', | ||||
|             '\\': '\\\\' | ||||
|         }; | ||||
|         JSON.stringify = function (value, replacer, space) { | ||||
| 
 | ||||
| // The stringify method takes a value and an optional replacer, and an optional
 | ||||
| // space parameter, and returns a JSON text. The replacer can be a function
 | ||||
| // that can replace values, or an array of strings that will select the keys.
 | ||||
| // A default replacer method can be provided. Use of the space parameter can
 | ||||
| // produce text that is more easily readable.
 | ||||
| 
 | ||||
|             var i; | ||||
|             gap = ''; | ||||
|             indent = ''; | ||||
| 
 | ||||
| // If the space parameter is a number, make an indent string containing that
 | ||||
| // many spaces.
 | ||||
| 
 | ||||
|             if (typeof space === 'number') { | ||||
|                 for (i = 0; i < space; i += 1) { | ||||
|                     indent += ' '; | ||||
|                 } | ||||
| 
 | ||||
| // If the space parameter is a string, it will be used as the indent string.
 | ||||
| 
 | ||||
|             } else if (typeof space === 'string') { | ||||
|                 indent = space; | ||||
|             } | ||||
| 
 | ||||
| // If there is a replacer, it must be a function or an array.
 | ||||
| // Otherwise, throw an error.
 | ||||
| 
 | ||||
|             rep = replacer; | ||||
|             if (replacer && typeof replacer !== 'function' && | ||||
|                     (typeof replacer !== 'object' || | ||||
|                     typeof replacer.length !== 'number')) { | ||||
|                 throw new Error('JSON.stringify'); | ||||
|             } | ||||
| 
 | ||||
| // Make a fake root object containing our value under the key of ''.
 | ||||
| // Return the result of stringifying the value.
 | ||||
| 
 | ||||
|             return str('', {'': value}); | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| // If the JSON object does not yet have a parse method, give it one.
 | ||||
| 
 | ||||
|     if (typeof JSON.parse !== 'function') { | ||||
|         cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; | ||||
|         JSON.parse = function (text, reviver) { | ||||
| 
 | ||||
| // The parse method takes a text and an optional reviver function, and returns
 | ||||
| // a JavaScript value if the text is a valid JSON text.
 | ||||
| 
 | ||||
|             var j; | ||||
| 
 | ||||
|             function walk(holder, key) { | ||||
| 
 | ||||
| // The walk method is used to recursively walk the resulting structure so
 | ||||
| // that modifications can be made.
 | ||||
| 
 | ||||
|                 var k, v, value = holder[key]; | ||||
|                 if (value && typeof value === 'object') { | ||||
|                     for (k in value) { | ||||
|                         if (Object.prototype.hasOwnProperty.call(value, k)) { | ||||
|                             v = walk(value, k); | ||||
|                             if (v !== undefined) { | ||||
|                                 value[k] = v; | ||||
|                             } else { | ||||
|                                 delete value[k]; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 return reviver.call(holder, key, value); | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
| // Parsing happens in four stages. In the first stage, we replace certain
 | ||||
| // Unicode characters with escape sequences. JavaScript handles many characters
 | ||||
| // incorrectly, either silently deleting them, or treating them as line endings.
 | ||||
| 
 | ||||
|             text = String(text); | ||||
|             cx.lastIndex = 0; | ||||
|             if (cx.test(text)) { | ||||
|                 text = text.replace(cx, function (a) { | ||||
|                     return '\\u' + | ||||
|                         ('0000' + a.charCodeAt(0).toString(16)).slice(-4); | ||||
|                 }); | ||||
|             } | ||||
| 
 | ||||
| // In the second stage, we run the text against regular expressions that look
 | ||||
| // for non-JSON patterns. We are especially concerned with '()' and 'new'
 | ||||
| // because they can cause invocation, and '=' because it can cause mutation.
 | ||||
| // But just to be safe, we want to reject all unexpected forms.
 | ||||
| 
 | ||||
| // We split the second stage into 4 regexp operations in order to work around
 | ||||
| // crippling inefficiencies in IE's and Safari's regexp engines. First we
 | ||||
| // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
 | ||||
| // replace all simple value tokens with ']' characters. Third, we delete all
 | ||||
| // open brackets that follow a colon or comma or that begin the text. Finally,
 | ||||
| // we look to see that the remaining characters are only whitespace or ']' or
 | ||||
| // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
 | ||||
| 
 | ||||
|             if (/^[\],:{}\s]*$/ | ||||
|                     .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') | ||||
|                         .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') | ||||
|                         .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { | ||||
| 
 | ||||
| // In the third stage we use the eval function to compile the text into a
 | ||||
| // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
 | ||||
| // in JavaScript: it can begin a block or an object literal. We wrap the text
 | ||||
| // in parens to eliminate the ambiguity.
 | ||||
| 
 | ||||
|                 j = eval('(' + text + ')'); | ||||
| 
 | ||||
| // In the optional fourth stage, we recursively walk the new structure, passing
 | ||||
| // each name/value pair to a reviver function for possible transformation.
 | ||||
| 
 | ||||
|                 return typeof reviver === 'function' | ||||
|                     ? walk({'': j}, '') | ||||
|                     : j; | ||||
|             } | ||||
| 
 | ||||
| // If the text is not JSON parseable, then a SyntaxError is thrown.
 | ||||
| 
 | ||||
|             throw new SyntaxError('JSON.parse'); | ||||
|         }; | ||||
|     } | ||||
| }()); | ||||
							
								
								
									
										260
									
								
								packages/ssf/ctest/mocha.css
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										260
									
								
								packages/ssf/ctest/mocha.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,260 @@ | ||||
| @charset "utf-8"; | ||||
| 
 | ||||
| body { | ||||
|   margin:0; | ||||
| } | ||||
| 
 | ||||
| #mocha { | ||||
|   font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; | ||||
|   margin: 60px 50px; | ||||
| } | ||||
| 
 | ||||
| #mocha ul, #mocha li { | ||||
|   margin: 0; | ||||
|   padding: 0; | ||||
| } | ||||
| 
 | ||||
| #mocha ul { | ||||
|   list-style: none; | ||||
| } | ||||
| 
 | ||||
| #mocha h1, #mocha h2 { | ||||
|   margin: 0; | ||||
| } | ||||
| 
 | ||||
| #mocha h1 { | ||||
|   margin-top: 15px; | ||||
|   font-size: 1em; | ||||
|   font-weight: 200; | ||||
| } | ||||
| 
 | ||||
| #mocha h1 a { | ||||
|   text-decoration: none; | ||||
|   color: inherit; | ||||
| } | ||||
| 
 | ||||
| #mocha h1 a:hover { | ||||
|   text-decoration: underline; | ||||
| } | ||||
| 
 | ||||
| #mocha .suite .suite h1 { | ||||
|   margin-top: 0; | ||||
|   font-size: .8em; | ||||
| } | ||||
| 
 | ||||
| #mocha .hidden { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #mocha h2 { | ||||
|   font-size: 12px; | ||||
|   font-weight: normal; | ||||
|   cursor: pointer; | ||||
| } | ||||
| 
 | ||||
| #mocha .suite { | ||||
|   margin-left: 15px; | ||||
| } | ||||
| 
 | ||||
| #mocha .test { | ||||
|   margin-left: 15px; | ||||
|   overflow: hidden; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pending:hover h2::after { | ||||
|   content: '(pending)'; | ||||
|   font-family: arial, sans-serif; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass.medium .duration { | ||||
|   background: #C09853; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass.slow .duration { | ||||
|   background: #B94A48; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass::before { | ||||
|   content: '✓'; | ||||
|   font-size: 12px; | ||||
|   display: block; | ||||
|   float: left; | ||||
|   margin-right: 5px; | ||||
|   color: #00d6b2; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass .duration { | ||||
|   font-size: 9px; | ||||
|   margin-left: 5px; | ||||
|   padding: 2px 5px; | ||||
|   color: white; | ||||
|   -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); | ||||
|   -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); | ||||
|   box-shadow: inset 0 1px 1px rgba(0,0,0,.2); | ||||
|   -webkit-border-radius: 5px; | ||||
|   -moz-border-radius: 5px; | ||||
|   -ms-border-radius: 5px; | ||||
|   -o-border-radius: 5px; | ||||
|   border-radius: 5px; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pass.fast .duration { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pending { | ||||
|   color: #0b97c4; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.pending::before { | ||||
|   content: '◦'; | ||||
|   color: #0b97c4; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.fail { | ||||
|   color: #c00; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.fail pre { | ||||
|   color: black; | ||||
| } | ||||
| 
 | ||||
| #mocha .test.fail::before { | ||||
|   content: '✖'; | ||||
|   font-size: 12px; | ||||
|   display: block; | ||||
|   float: left; | ||||
|   margin-right: 5px; | ||||
|   color: #c00; | ||||
| } | ||||
| 
 | ||||
| #mocha .test pre.error { | ||||
|   color: #c00; | ||||
|   max-height: 300px; | ||||
|   overflow: auto; | ||||
| } | ||||
| 
 | ||||
| #mocha .test pre { | ||||
|   display: block; | ||||
|   float: left; | ||||
|   clear: left; | ||||
|   font: 12px/1.5 monaco, monospace; | ||||
|   margin: 5px; | ||||
|   padding: 15px; | ||||
|   border: 1px solid #eee; | ||||
|   border-bottom-color: #ddd; | ||||
|   -webkit-border-radius: 3px; | ||||
|   -webkit-box-shadow: 0 1px 3px #eee; | ||||
|   -moz-border-radius: 3px; | ||||
|   -moz-box-shadow: 0 1px 3px #eee; | ||||
|   border-radius: 3px; | ||||
| } | ||||
| 
 | ||||
| #mocha .test h2 { | ||||
|   position: relative; | ||||
| } | ||||
| 
 | ||||
| #mocha .test a.replay { | ||||
|   position: absolute; | ||||
|   top: 3px; | ||||
|   right: 0; | ||||
|   text-decoration: none; | ||||
|   vertical-align: middle; | ||||
|   display: block; | ||||
|   width: 15px; | ||||
|   height: 15px; | ||||
|   line-height: 15px; | ||||
|   text-align: center; | ||||
|   background: #eee; | ||||
|   font-size: 15px; | ||||
|   -moz-border-radius: 15px; | ||||
|   border-radius: 15px; | ||||
|   -webkit-transition: opacity 200ms; | ||||
|   -moz-transition: opacity 200ms; | ||||
|   transition: opacity 200ms; | ||||
|   opacity: 0.3; | ||||
|   color: #888; | ||||
| } | ||||
| 
 | ||||
| #mocha .test:hover a.replay { | ||||
|   opacity: 1; | ||||
| } | ||||
| 
 | ||||
| #mocha-report.pass .test.fail { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #mocha-report.fail .test.pass { | ||||
|   display: none; | ||||
| } | ||||
| 
 | ||||
| #mocha-report.pending .test.pass, | ||||
| #mocha-report.pending .test.fail { | ||||
|   display: none; | ||||
| } | ||||
| #mocha-report.pending .test.pass.pending { | ||||
|   display: block; | ||||
| } | ||||
| 
 | ||||
| #mocha-error { | ||||
|   color: #c00; | ||||
|   font-size: 1.5em; | ||||
|   font-weight: 100; | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats { | ||||
|   position: fixed; | ||||
|   top: 15px; | ||||
|   right: 10px; | ||||
|   font-size: 12px; | ||||
|   margin: 0; | ||||
|   color: #888; | ||||
|   z-index: 1; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats .progress { | ||||
|   float: right; | ||||
|   padding-top: 0; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats em { | ||||
|   color: black; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats a { | ||||
|   text-decoration: none; | ||||
|   color: inherit; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats a:hover { | ||||
|   border-bottom: 1px solid #eee; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats li { | ||||
|   display: inline-block; | ||||
|   margin: 0 5px; | ||||
|   list-style: none; | ||||
|   padding-top: 11px; | ||||
| } | ||||
| 
 | ||||
| #mocha-stats canvas { | ||||
|   width: 40px; | ||||
|   height: 40px; | ||||
| } | ||||
| 
 | ||||
| #mocha code .comment { color: #ddd } | ||||
| #mocha code .init { color: #2F6FAD } | ||||
| #mocha code .string { color: #5890AD } | ||||
| #mocha code .keyword { color: #8A6343 } | ||||
| #mocha code .number { color: #2F6FAD } | ||||
| 
 | ||||
| @media screen and (max-device-width: 480px) { | ||||
|   #mocha  { | ||||
|     margin: 60px 0px; | ||||
|   } | ||||
| 
 | ||||
|   #mocha #stats { | ||||
|     position: absolute; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										5554
									
								
								packages/ssf/ctest/mocha.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										5554
									
								
								packages/ssf/ctest/mocha.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										330
									
								
								packages/ssf/ctest/shim.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										330
									
								
								packages/ssf/ctest/shim.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,330 @@ | ||||
| // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
 | ||||
| if (!Object.keys) { | ||||
|   Object.keys = (function () { | ||||
|     var hasOwnProperty = Object.prototype.hasOwnProperty, | ||||
|         hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), | ||||
|         dontEnums = [ | ||||
|           'toString', | ||||
|           'toLocaleString', | ||||
|           'valueOf', | ||||
|           'hasOwnProperty', | ||||
|           'isPrototypeOf', | ||||
|           'propertyIsEnumerable', | ||||
|           'constructor' | ||||
|         ], | ||||
|         dontEnumsLength = dontEnums.length; | ||||
| 
 | ||||
|     return function (obj) { | ||||
|       if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object'); | ||||
| 
 | ||||
|       var result = []; | ||||
| 
 | ||||
|       for (var prop in obj) { | ||||
|         if (hasOwnProperty.call(obj, prop)) result.push(prop); | ||||
|       } | ||||
| 
 | ||||
|       if (hasDontEnumBug) { | ||||
|         for (var i=0; i < dontEnumsLength; i++) { | ||||
|           if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); | ||||
|         } | ||||
|       } | ||||
|       return result; | ||||
|     }; | ||||
|   })(); | ||||
| } | ||||
| 
 | ||||
| // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
 | ||||
| if (!Array.prototype.filter) | ||||
| { | ||||
|   Array.prototype.filter = function(fun /*, thisp */) | ||||
|   { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     if (this == null) | ||||
|       throw new TypeError(); | ||||
| 
 | ||||
|     var t = Object(this); | ||||
|     var len = t.length >>> 0; | ||||
|     if (typeof fun != "function") | ||||
|       throw new TypeError(); | ||||
| 
 | ||||
|     var res = []; | ||||
|     var thisp = arguments[1]; | ||||
|     for (var i = 0; i < len; i++) | ||||
|     { | ||||
|       if (i in t) | ||||
|       { | ||||
|         var val = t[i]; // in case fun mutates this
 | ||||
|         if (fun.call(thisp, val, i, t)) | ||||
|           res.push(val); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     return res; | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
 | ||||
| if (!String.prototype.trim) { | ||||
|   String.prototype.trim = function () { | ||||
|     return this.replace(/^\s+|\s+$/g, ''); | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
 | ||||
| if (!Array.prototype.forEach) | ||||
| { | ||||
|   Array.prototype.forEach = function(fun /*, thisArg */) | ||||
|   { | ||||
|     "use strict"; | ||||
| 
 | ||||
|     if (this === void 0 || this === null) | ||||
|       throw new TypeError(); | ||||
| 
 | ||||
|     var t = Object(this); | ||||
|     var len = t.length >>> 0; | ||||
|     if (typeof fun !== "function") | ||||
|       throw new TypeError(); | ||||
| 
 | ||||
|     var thisArg = arguments.length >= 2 ? arguments[1] : void 0; | ||||
|     for (var i = 0; i < len; i++) | ||||
|     { | ||||
|       if (i in t) | ||||
|         fun.call(thisArg, t[i], i, t); | ||||
|     } | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| // Production steps of ECMA-262, Edition 5, 15.4.4.19
 | ||||
| // Reference: http://es5.github.com/#x15.4.4.19
 | ||||
| if (!Array.prototype.map) { | ||||
|   Array.prototype.map = function(callback, thisArg) { | ||||
| 
 | ||||
|     var T, A, k; | ||||
| 
 | ||||
|     if (this == null) { | ||||
|       throw new TypeError(" this is null or not defined"); | ||||
|     } | ||||
| 
 | ||||
|     // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
 | ||||
|     var O = Object(this); | ||||
| 
 | ||||
|     // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
 | ||||
|     // 3. Let len be ToUint32(lenValue).
 | ||||
|     var len = O.length >>> 0; | ||||
| 
 | ||||
|     // 4. If IsCallable(callback) is false, throw a TypeError exception.
 | ||||
|     // See: http://es5.github.com/#x9.11
 | ||||
|     if (typeof callback !== "function") { | ||||
|       throw new TypeError(callback + " is not a function"); | ||||
|     } | ||||
| 
 | ||||
|     // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
 | ||||
|     if (thisArg) { | ||||
|       T = thisArg; | ||||
|     } | ||||
| 
 | ||||
|     // 6. Let A be a new array created as if by the expression new Array(len) where Array is
 | ||||
|     // the standard built-in constructor with that name and len is the value of len.
 | ||||
|     A = new Array(len); | ||||
| 
 | ||||
|     // 7. Let k be 0
 | ||||
|     k = 0; | ||||
| 
 | ||||
|     // 8. Repeat, while k < len
 | ||||
|     while(k < len) { | ||||
| 
 | ||||
|       var kValue, mappedValue; | ||||
| 
 | ||||
|       // a. Let Pk be ToString(k).
 | ||||
|       //   This is implicit for LHS operands of the in operator
 | ||||
|       // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
 | ||||
|       //   This step can be combined with c
 | ||||
|       // c. If kPresent is true, then
 | ||||
|       if (k in O) { | ||||
| 
 | ||||
|         // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
 | ||||
|         kValue = O[ k ]; | ||||
| 
 | ||||
|         // ii. Let mappedValue be the result of calling the Call internal method of callback
 | ||||
|         // with T as the this value and argument list containing kValue, k, and O.
 | ||||
|         mappedValue = callback.call(T, kValue, k, O); | ||||
| 
 | ||||
|         // iii. Call the DefineOwnProperty internal method of A with arguments
 | ||||
|         // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},
 | ||||
|         // and false.
 | ||||
| 
 | ||||
|         // In browsers that support Object.defineProperty, use the following:
 | ||||
|         // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });
 | ||||
| 
 | ||||
|         // For best browser support, use the following:
 | ||||
|         A[ k ] = mappedValue; | ||||
|       } | ||||
|       // d. Increase k by 1.
 | ||||
|       k++; | ||||
|     } | ||||
| 
 | ||||
|     // 9. return A
 | ||||
|     return A; | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
 | ||||
| if (!Array.prototype.indexOf) { | ||||
|   Array.prototype.indexOf = function (searchElement, fromIndex) { | ||||
|     if ( this === undefined || this === null ) { | ||||
|       throw new TypeError( '"this" is null or not defined' ); | ||||
|     } | ||||
| 
 | ||||
|     var length = this.length >>> 0; // Hack to convert object.length to a UInt32
 | ||||
| 
 | ||||
|     fromIndex = +fromIndex || 0; | ||||
| 
 | ||||
|     if (Math.abs(fromIndex) === Infinity) { | ||||
|       fromIndex = 0; | ||||
|     } | ||||
| 
 | ||||
|     if (fromIndex < 0) { | ||||
|       fromIndex += length; | ||||
|       if (fromIndex < 0) { | ||||
|         fromIndex = 0; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     for (;fromIndex < length; fromIndex++) { | ||||
|       if (this[fromIndex] === searchElement) { | ||||
|         return fromIndex; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     return -1; | ||||
|   }; | ||||
| } | ||||
| // Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
 | ||||
| 
 | ||||
| if (! Array.isArray) { | ||||
|     Array.isArray = function(obj) { | ||||
|         return Object.prototype.toString.call(obj) === "[object Array]"; | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| // https://github.com/ttaubert/node-arraybuffer-slice
 | ||||
| // (c) 2013 Tim Taubert <tim@timtaubert.de>
 | ||||
| // arraybuffer-slice may be freely distributed under the MIT license.
 | ||||
| 
 | ||||
| "use strict"; | ||||
| 
 | ||||
| if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) { | ||||
|   ArrayBuffer.prototype.slice = function (begin, end) { | ||||
|     begin = (begin|0) || 0; | ||||
|     var num = this.byteLength; | ||||
|     end = end === (void 0) ? num : (end|0); | ||||
| 
 | ||||
|     // Handle negative values.
 | ||||
|     if (begin < 0) begin += num; | ||||
|     if (end < 0) end += num; | ||||
| 
 | ||||
|     if (num === 0 || begin >= num || begin >= end) { | ||||
|       return new ArrayBuffer(0); | ||||
|     } | ||||
| 
 | ||||
|     var length = Math.min(num - begin, end - begin); | ||||
|     var target = new ArrayBuffer(length); | ||||
|     var targetArray = new Uint8Array(target); | ||||
|     targetArray.set(new Uint8Array(this, begin, length)); | ||||
|     return target; | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| // https://github.com/davidchambers/Base64.js
 | ||||
| // (C) 2015 David Chambers
 | ||||
| // Base64.js may be freely distributed under the Apache 2.0 License.
 | ||||
| 
 | ||||
| ;(function () { | ||||
| 
 | ||||
|   var object = typeof exports != 'undefined' ? exports : typeof self != 'undefined' ? self : eval("this"); | ||||
|   var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; | ||||
| 
 | ||||
|   function InvalidCharacterError(message) { | ||||
|     this.message = message; | ||||
|   } | ||||
|   InvalidCharacterError.prototype = new Error; | ||||
|   InvalidCharacterError.prototype.name = 'InvalidCharacterError'; | ||||
| 
 | ||||
|   // encoder
 | ||||
|   // [https://gist.github.com/999166] by [https://github.com/nignag]
 | ||||
|   object.btoa || ( | ||||
|   object.btoa = function (input) { | ||||
|     var str = String(input); | ||||
|     for ( | ||||
|       // initialize result and counter
 | ||||
|       var block, charCode, idx = 0, map = chars, output = ''; | ||||
|       // if the next str index does not exist:
 | ||||
|       //   change the mapping table to "="
 | ||||
|       //   check if d has no fractional digits
 | ||||
|       str.charAt(idx | 0) || (map = '=', idx % 1); | ||||
|       // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
 | ||||
|       output += map.charAt(63 & block >> 8 - idx % 1 * 8) | ||||
|     ) { | ||||
|       charCode = str.charCodeAt(idx += 3/4); | ||||
|       if (charCode > 0xFF) { | ||||
|         throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."); | ||||
|       } | ||||
|       block = block << 8 | charCode; | ||||
|     } | ||||
|     return output; | ||||
|   }); | ||||
| 
 | ||||
|   // decoder
 | ||||
|   // [https://gist.github.com/1020396] by [https://github.com/atk]
 | ||||
|   object.atob || ( | ||||
|   object.atob = function (input) { | ||||
|     var str = String(input).replace(new RegExp("=+$"), ''); | ||||
|     if (str.length % 4 == 1) { | ||||
|       throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded."); | ||||
|     } | ||||
|     for ( | ||||
|       // initialize result and counters
 | ||||
|       var bc = 0, bs, buffer, idx = 0, output = ''; | ||||
|       // get next character
 | ||||
|       buffer = str.charAt(idx++); | ||||
|       // character found in table? initialize bit storage and add its ascii value;
 | ||||
|       ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, | ||||
|         // and if not first of each 4 characters,
 | ||||
|         // convert the first 8 bits to one ascii character
 | ||||
|         bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 | ||||
|     ) { | ||||
|       // try to find character in table (0-63, not found => -1)
 | ||||
|       buffer = chars.indexOf(buffer); | ||||
|     } | ||||
|     return output; | ||||
|   }); | ||||
| 
 | ||||
| }()); | ||||
| 
 | ||||
| 
 | ||||
| // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
 | ||||
| if (!Date.prototype.toISOString) { | ||||
|   (function() { | ||||
| 
 | ||||
|     function pad(number) { | ||||
|       if (number < 10) { | ||||
|         return '0' + number; | ||||
|       } | ||||
|       return number; | ||||
|     } | ||||
| 
 | ||||
|     Date.prototype.toISOString = function() { | ||||
|       return this.getUTCFullYear() + | ||||
|         '-' + pad(this.getUTCMonth() + 1) + | ||||
|         '-' + pad(this.getUTCDate()) + | ||||
|         'T' + pad(this.getUTCHours()) + | ||||
|         ':' + pad(this.getUTCMinutes()) + | ||||
|         ':' + pad(this.getUTCSeconds()) + | ||||
|         '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + | ||||
|         'Z'; | ||||
|     }; | ||||
| 
 | ||||
|   }()); | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										70
									
								
								packages/ssf/index.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										70
									
								
								packages/ssf/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | ||||
| <!DOCTYPE html> | ||||
| <!-- ssf.js (C) 2013-present  SheetJS http://sheetjs.com --> | ||||
| <!-- vim: set ts=2: --> | ||||
| <html> | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| <title>SSF Live Demo</title> | ||||
| <style> | ||||
| a { text-decoration: none } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SSF (Spreadsheet Number Format) Live Demo</a></b> | ||||
| 
 | ||||
| <a href="https://github.com/SheetJS/ssf">Source Code Repo</a> | ||||
| <a href="https://github.com/SheetJS/ssf/issues">Issues?  Something look weird?  Click here and report an issue</a> | ||||
| </pre> | ||||
| <table> | ||||
| 	<tr><td><b>Format code:</b></td><td><input type="text" id="fmt" value="General"></td></tr> | ||||
| 	<tr><td><b>Value:</b></td><td><input type="text" id="val" value="3.1415926535"></td></tr> | ||||
| 	<tr><td colspan="2"> </td></tr> | ||||
| 	<tr><td><b>Formatted Number:</b></td><td><pre id="num"></pre></td></tr> | ||||
| 	<tr><td><b>Formatted Text</b></td><td><pre id="txt"></pre></td></tr> | ||||
| </table> | ||||
| <script src="ssf.js"></script> | ||||
| <script> | ||||
| /*jshint browser:true */ | ||||
| /*eslint-env browser */ | ||||
| /*eslint no-use-before-define:0 */ | ||||
| /*global SSF */ | ||||
| var F = document.getElementById('fmt'); | ||||
| var V = document.getElementById('val'); | ||||
| var N = document.getElementById('num'); | ||||
| var T = document.getElementById('txt'); | ||||
| 
 | ||||
| function update() { | ||||
| 	try { | ||||
| 		N.innerHTML = SSF.format(F.value, Number(V.value)); | ||||
| 	} catch(e) { N.innerHTML = e; } | ||||
| 	try { | ||||
| 		T.innerHTML = SSF.format(F.value, V.value); | ||||
| 	} catch(e) { T.innerHTML = e; } | ||||
| } | ||||
| 
 | ||||
| /* Bind to relevant events */ | ||||
| if(F.addEventListener) { | ||||
| 	F.addEventListener('keyup', update); | ||||
| 	V.addEventListener('keyup', update); | ||||
| } else if(F.attachEvent) { | ||||
| 	F.attachEvent('onkeyup', update); | ||||
| 	V.attachEvent('onkeyup', update); | ||||
| } else { | ||||
| 	F.oninput = update; | ||||
| 	V.oninput = update; | ||||
| } | ||||
| 
 | ||||
| update(); | ||||
| 	var _gaq = _gaq || []; | ||||
| 	_gaq.push(['_setAccount', 'UA-36810333-1']); | ||||
| 	_gaq.push(['_trackPageview']); | ||||
| 
 | ||||
| 	(function() { | ||||
| 		var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||||
| 		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||||
| 		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||||
| 	})(); | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										31
									
								
								packages/ssf/misc/flow.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										31
									
								
								packages/ssf/misc/flow.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| /*# vim: set ts=2: */ | ||||
| /*:: | ||||
| 
 | ||||
| type SSFTable = {[key:number|string]:string}; | ||||
| type SSFDate = { | ||||
| 	D:number; T:number; | ||||
| 	y:number; m:number; d:number; q:number; | ||||
| 	H:number; M:number; S:number; u:number; | ||||
| }; | ||||
| 
 | ||||
| type SSFModule = { | ||||
| 	format:(fmt:string|number, v:any, o:any)=>string; | ||||
| 
 | ||||
| 	is_date:(fmt:string)=>boolean; | ||||
| 	parse_date_code:(v:number,opts:any)=>?SSFDate; | ||||
| 
 | ||||
| 	load:(fmt:string, idx:?number)=>number; | ||||
| 	get_table:()=>SSFTable; | ||||
| 	load_table:(table:any)=>void; | ||||
| 	_table:SSFTable; | ||||
| 	init_table:any; | ||||
| 
 | ||||
| 	_general_int:(v:number)=>string; | ||||
| 	_general_num:(v:number)=>string; | ||||
| 	_general:(v:number, o:?any)=>string; | ||||
| 	_eval:any; | ||||
| 	_split:any; | ||||
| 	version:string; | ||||
| }; | ||||
| 
 | ||||
| */ | ||||
							
								
								
									
										7
									
								
								packages/ssf/misc/flowdeps.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										7
									
								
								packages/ssf/misc/flowdeps.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| /*# vim: set ts=2: */ | ||||
| /*:: | ||||
| 
 | ||||
| declare module './' { declare module.exports:SSFModule; }; | ||||
| declare module '../' { declare module.exports:SSFModule; }; | ||||
| declare module 'ssf' { declare module.exports:SSFModule; }; | ||||
| */ | ||||
							
								
								
									
										42
									
								
								packages/ssf/misc/help.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										42
									
								
								packages/ssf/misc/help.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,42 @@ | ||||
| #!/bin/bash | ||||
| # make_help.sh -- process listing of targets and special items in Makefile | ||||
| # Copyright (C) 2016-present  SheetJS | ||||
| # | ||||
| # usage in makefile: pipe the output of the following command: | ||||
| #     @grep -hE '(^[a-zA-Z_-][ a-zA-Z_-]*:.*?|^#[#*])' $(MAKEFILE_LIST) | ||||
| # | ||||
| # lines starting with "## " are treated as subtitles | ||||
| # lines starting with "#* " are treated as plaintext comments | ||||
| # multiple targets with "## " after the ":" are rendered as separate targets | ||||
| # if the presumed default target is labeled, it will be assigned a unique color | ||||
| 
 | ||||
| awk ' | ||||
| BEGIN{recipes=0;} | ||||
| 	!/#[#*] .*$/ {next;} | ||||
| 	{multi=0; isrecipe=0;} | ||||
| 	/^[^#]*:/ {isrecipe=1; ++recipes;} | ||||
| 	/^[^ :]* .*:/ {multi=1} | ||||
| 	multi==0 && isrecipe>0 { if(recipes > 1) print; else print $0, "[default]"; next} | ||||
| 	isrecipe == 0 {print; next} | ||||
| 	multi>0 { | ||||
| 		k=split($0, msg, "##"); m=split($0, a, ":"); n=split(a[1], b, " "); | ||||
| 		for(i=1; i<=n; ++i) print b[i] ":", "##" msg[2], (recipes==1 && i==1 ? "[default]" : "") | ||||
| 	} | ||||
| END {} | ||||
| ' | if [[ -t 1 ]]; then | ||||
| awk ' | ||||
| BEGIN {FS = ":.*?## "} | ||||
| 	{color=36} | ||||
| 	/\[default\]/ {color=35} | ||||
| 	NF==1 && /^##/ {color=34} | ||||
| 	NF==1 && /^#\*/ {color=20; $1 = substr($1, 4)} | ||||
| 	{printf "\033[" color "m%-20s\033[0m %s\n", $1, $2;} | ||||
| END{}' - | ||||
| else | ||||
| awk ' | ||||
| BEGIN {FS = ":.*?## "} | ||||
| 	/^#\* / {$1 = substr($1, 4)} | ||||
| 	{printf "%-20s %s\n", $1, $2;} | ||||
| END{}' - | ||||
| fi | ||||
| 
 | ||||
							
								
								
									
										11
									
								
								packages/ssf/misc/node_version.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										11
									
								
								packages/ssf/misc/node_version.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,11 @@ | ||||
| #! /usr/bin/env bash | ||||
| 
 | ||||
| # This script will check the current version of node and install another version | ||||
| # of npm if node is version 0.8 | ||||
| 
 | ||||
| version=$(node --version) | ||||
| 
 | ||||
| if [[ $version =~ v0\.8\. ]] | ||||
| then | ||||
|   npm install -g npm@4.3.0 | ||||
| fi | ||||
							
								
								
									
										77
									
								
								packages/ssf/misc/perf.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										77
									
								
								packages/ssf/misc/perf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs')//, assert = require('assert');
 | ||||
| var data = JSON.parse(fs.readFileSync('./test/oddities.json','utf8')); | ||||
| var dates = fs.readFileSync('./test/dates.tsv','utf8').split("\n"); | ||||
| var date2 = fs.readFileSync('./test/cal.tsv',  'utf8').split("\n"); | ||||
| var times = fs.readFileSync('./test/times.tsv','utf8').split("\n"); | ||||
| function doit(data) { | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   var headers = data[0].split("\t"); | ||||
|   for(var k = 1; k <= data.length; ++k) { | ||||
|     if(data[k] == null) return; | ||||
|     var d = data[k].replace(/#{255}/g,"").split("\t"); | ||||
|     for(var w = 1; w < headers.length; ++w) { | ||||
|       var expected = d[w], actual = SSF.format(headers[w], parseFloat(d[0]), {}); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| function testit() { | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   /* Prevent Optimization */ | ||||
|   doit(times.slice(0,4000)); | ||||
|   doit(dates.slice(0,4000)); | ||||
|     for(var i = 0; i != 1000; ++i) { | ||||
|     for(var k = 0; k != data.length; ++k) { | ||||
|       var d = data[k]; | ||||
|       for(var j=1;j<d.length;++j) { | ||||
|         if(d[j].length == 2) { | ||||
|           var expected = d[j][1], actual = SSF.format(d[0], d[j][0], {}); | ||||
|           //if(actual != expected) console.log(d[j]);
 | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| testit(); | ||||
							
								
								
									
										13
									
								
								packages/ssf/misc/perf.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										13
									
								
								packages/ssf/misc/perf.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,13 @@ | ||||
| #!/bin/bash | ||||
| ARGS="--trace_opt --trace_deopt --trace_inlining --code_comments" | ||||
| #ARGS="--trace_opt --trace_deopt --code_comments" | ||||
| SCPT=misc/perf.js | ||||
| 
 | ||||
| echo 1 | ||||
| make && jshint --show-non-errors ssf.js && make lint && | ||||
| MINTEST=1 mocha -b && time node $SCPT && { | ||||
| node $ARGS $SCPT > perf.log | ||||
| node --prof $SCPT | ||||
| echo 1; time node $SCPT >/dev/null | ||||
| echo 1; time node $SCPT >/dev/null | ||||
| } && grep disabled perf.log | ||||
							
								
								
									
										1
									
								
								packages/ssf/misc/photoshop.jsx
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								packages/ssf/misc/photoshop.jsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| #include "ssf.flow.js";
var fmt = 10;
var data = 123.456789;
alert(SSF.format(fmt, data)); | ||||
							
								
								
									
										14
									
								
								packages/ssf/misc/spin.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										14
									
								
								packages/ssf/misc/spin.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #!/bin/bash | ||||
| # spin.sh -- show a spinner (for coverage test) | ||||
| # Copyright (C) 2014-present  SheetJS | ||||
| 
 | ||||
| wpid=$1 | ||||
| delay=1 | ||||
| str="|/-\\" | ||||
| while [ $(ps -a|awk '$1=='$wpid' {print $1}') ]; do | ||||
|   t=${str#?} | ||||
|   printf " [%c]" "$str" | ||||
|   str=$t${str%"$t"} | ||||
|   sleep $delay | ||||
|   printf "\b\b\b\b" | ||||
| done | ||||
							
								
								
									
										58
									
								
								packages/ssf/package.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										58
									
								
								packages/ssf/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | ||||
| { | ||||
| 	"name": "ssf", | ||||
| 	"version": "0.11.2", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "Format data using ECMA-376 spreadsheet Format Codes", | ||||
| 	"keywords": [ | ||||
| 		"format", | ||||
| 		"sprintf", | ||||
| 		"spreadsheet" | ||||
| 	], | ||||
| 	"main": "ssf.js", | ||||
| 	"types": "types", | ||||
| 	"dependencies": { | ||||
| 		"frac":"~1.1.2" | ||||
| 	}, | ||||
| 	"devDependencies": { | ||||
| 		"@sheetjs/uglify-js":"~2.7.3", | ||||
| 		"@types/node":"^8.0.7", | ||||
| 		"blanket": "~1.2.3", | ||||
| 		"dtslint": "^0.1.2", | ||||
| 		"mocha": "~2.5.3", | ||||
| 		"typescript": "2.2.0" | ||||
| 	}, | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
| 		"url": "git://github.com/SheetJS/sheetjs.git", | ||||
| 		"directory": "packages/ssf" | ||||
| 	}, | ||||
| 	"scripts": { | ||||
| 		"test": "make test", | ||||
| 		"build": "make", | ||||
| 		"lint": "make fullint", | ||||
| 		"dtslint": "dtslint types" | ||||
| 	}, | ||||
| 	"config": { | ||||
| 		"blanket": { | ||||
| 			"pattern": "ssf.js" | ||||
| 		} | ||||
| 	}, | ||||
| 	"alex": { | ||||
| 		"allow": [ | ||||
| 			"special", | ||||
| 			"simple", | ||||
| 			"just", | ||||
| 			"crash", | ||||
| 			"wtf", | ||||
| 			"holes" | ||||
| 		] | ||||
| 	}, | ||||
| 	"homepage": "http://sheetjs.com/", | ||||
| 	"bugs": { | ||||
| 		"url": "https://github.com/SheetJS/sheetjs/issues" | ||||
| 	}, | ||||
| 	"license": "Apache-2.0", | ||||
| 	"engines": { | ||||
| 		"node": ">=0.8" | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										980
									
								
								packages/ssf/ssf.flow.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										980
									
								
								packages/ssf/ssf.flow.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,980 @@ | ||||
| /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint -W041 */ | ||||
| /*:: declare var DO_NOT_EXPORT_SSF: any; */ | ||||
| var SSF/*:SSFModule*/ = ({}/*:any*/); | ||||
| var make_ssf = function make_ssf(SSF/*:SSFModule*/){ | ||||
| SSF.version = '0.11.2'; | ||||
| function _strrev(x/*:string*/)/*:string*/ { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; } | ||||
| function fill(c/*:string*/,l/*:number*/)/*:string*/ { var o = ""; while(o.length < l) o+=c; return o; } | ||||
| function pad0(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| function pad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;} | ||||
| function rpad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);} | ||||
| function pad0r1(v/*:any*/,d/*:number*/)/*:string*/{var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| function pad0r2(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| var p2_32 = Math.pow(2,32); | ||||
| function pad0r(v/*:any*/,d/*:number*/)/*:string*/{if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); } | ||||
| function isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; } | ||||
| /*:: | ||||
| type SSF_write_num = {(type:string, fmt:string, val:number):string}; | ||||
| */ | ||||
| var days/*:Array<Array<string> >*/ = [ | ||||
| 	['Sun', 'Sunday'], | ||||
| 	['Mon', 'Monday'], | ||||
| 	['Tue', 'Tuesday'], | ||||
| 	['Wed', 'Wednesday'], | ||||
| 	['Thu', 'Thursday'], | ||||
| 	['Fri', 'Friday'], | ||||
| 	['Sat', 'Saturday'] | ||||
| ]; | ||||
| var months/*:Array<Array<string> >*/ = [ | ||||
| 	['J', 'Jan', 'January'], | ||||
| 	['F', 'Feb', 'February'], | ||||
| 	['M', 'Mar', 'March'], | ||||
| 	['A', 'Apr', 'April'], | ||||
| 	['M', 'May', 'May'], | ||||
| 	['J', 'Jun', 'June'], | ||||
| 	['J', 'Jul', 'July'], | ||||
| 	['A', 'Aug', 'August'], | ||||
| 	['S', 'Sep', 'September'], | ||||
| 	['O', 'Oct', 'October'], | ||||
| 	['N', 'Nov', 'November'], | ||||
| 	['D', 'Dec', 'December'] | ||||
| ]; | ||||
| function init_table(t/*:any*/) { | ||||
| 	t[0]=  'General'; | ||||
| 	t[1]=  '0'; | ||||
| 	t[2]=  '0.00'; | ||||
| 	t[3]=  '#,##0'; | ||||
| 	t[4]=  '#,##0.00'; | ||||
| 	t[9]=  '0%'; | ||||
| 	t[10]= '0.00%'; | ||||
| 	t[11]= '0.00E+00'; | ||||
| 	t[12]= '# ?/?'; | ||||
| 	t[13]= '# ??/??'; | ||||
| 	t[14]= 'm/d/yy'; | ||||
| 	t[15]= 'd-mmm-yy'; | ||||
| 	t[16]= 'd-mmm'; | ||||
| 	t[17]= 'mmm-yy'; | ||||
| 	t[18]= 'h:mm AM/PM'; | ||||
| 	t[19]= 'h:mm:ss AM/PM'; | ||||
| 	t[20]= 'h:mm'; | ||||
| 	t[21]= 'h:mm:ss'; | ||||
| 	t[22]= 'm/d/yy h:mm'; | ||||
| 	t[37]= '#,##0 ;(#,##0)'; | ||||
| 	t[38]= '#,##0 ;[Red](#,##0)'; | ||||
| 	t[39]= '#,##0.00;(#,##0.00)'; | ||||
| 	t[40]= '#,##0.00;[Red](#,##0.00)'; | ||||
| 	t[45]= 'mm:ss'; | ||||
| 	t[46]= '[h]:mm:ss'; | ||||
| 	t[47]= 'mmss.0'; | ||||
| 	t[48]= '##0.0E+0'; | ||||
| 	t[49]= '@'; | ||||
| 	t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "'; | ||||
| } | ||||
| 
 | ||||
| var table_fmt = {}; | ||||
| init_table(table_fmt); | ||||
| /* Defaults determined by systematically testing in Excel 2019 */ | ||||
| 
 | ||||
| /* These formats appear to default to other formats in the table */ | ||||
| var default_map/*:Array<number>*/ = []; | ||||
| var defi = 0; | ||||
| 
 | ||||
| //  5 -> 37 ...  8 -> 40
 | ||||
| for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi; | ||||
| 
 | ||||
| // 23 ->  0 ... 26 ->  0
 | ||||
| for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0; | ||||
| 
 | ||||
| // 27 -> 14 ... 31 -> 14
 | ||||
| for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14; | ||||
| // 50 -> 14 ... 58 -> 14
 | ||||
| for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14; | ||||
| 
 | ||||
| // 59 ->  1 ... 62 ->  4
 | ||||
| for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58; | ||||
| // 67 ->  9 ... 68 -> 10
 | ||||
| for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58; | ||||
| // 72 -> 14 ... 75 -> 17
 | ||||
| for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58; | ||||
| 
 | ||||
| // 69 -> 12 ... 71 -> 14
 | ||||
| for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57; | ||||
| 
 | ||||
| // 76 -> 20 ... 78 -> 22
 | ||||
| for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56; | ||||
| 
 | ||||
| // 79 -> 45 ... 81 -> 47
 | ||||
| for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34; | ||||
| 
 | ||||
| // 82 ->  0 ... 65536 -> 0 (omitted)
 | ||||
| 
 | ||||
| /* These formats technically refer to Accounting formats with no equivalent */ | ||||
| var default_str/*:Array<string>*/ = []; | ||||
| 
 | ||||
| //  5 -- Currency,   0 decimal, black negative
 | ||||
| default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)'; | ||||
| //  6 -- Currency,   0 decimal, red   negative
 | ||||
| default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)'; | ||||
| //  7 -- Currency,   2 decimal, black negative
 | ||||
| default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)'; | ||||
| //  8 -- Currency,   2 decimal, red   negative
 | ||||
| default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)'; | ||||
| 
 | ||||
| // 41 -- Accounting, 0 decimal, No Symbol
 | ||||
| default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)'; | ||||
| // 42 -- Accounting, 0 decimal, $  Symbol
 | ||||
| default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)'; | ||||
| // 43 -- Accounting, 2 decimal, No Symbol
 | ||||
| default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)'; | ||||
| // 44 -- Accounting, 2 decimal, $  Symbol
 | ||||
| default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'; | ||||
| function frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/ { | ||||
| 	var sgn = x < 0 ? -1 : 1; | ||||
| 	var B = x * sgn; | ||||
| 	var P_2 = 0, P_1 = 1, P = 0; | ||||
| 	var Q_2 = 1, Q_1 = 0, Q = 0; | ||||
| 	var A = Math.floor(B); | ||||
| 	while(Q_1 < D) { | ||||
| 		A = Math.floor(B); | ||||
| 		P = A * P_1 + P_2; | ||||
| 		Q = A * Q_1 + Q_2; | ||||
| 		if((B - A) < 0.00000005) break; | ||||
| 		B = 1 / (B - A); | ||||
| 		P_2 = P_1; P_1 = P; | ||||
| 		Q_2 = Q_1; Q_1 = Q; | ||||
| 	} | ||||
| 	if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } } | ||||
| 	if(!mixed) return [0, sgn * P, Q]; | ||||
| 	var q = Math.floor(sgn * P/Q); | ||||
| 	return [q, sgn*P - q*Q, Q]; | ||||
| } | ||||
| function parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) { | ||||
| 	if(v > 2958465 || v < 0) return null; | ||||
| 	var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0; | ||||
| 	var dout=[]; | ||||
| 	var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0}; | ||||
| 	if(Math.abs(out.u) < 1e-6) out.u = 0; | ||||
| 	if(opts && opts.date1904) date += 1462; | ||||
| 	if(out.u > 0.9999) { | ||||
| 		out.u = 0; | ||||
| 		if(++time == 86400) { out.T = time = 0; ++date; ++out.D; } | ||||
| 	} | ||||
| 	if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;} | ||||
| 	else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;} | ||||
| 	else { | ||||
| 		if(date > 60) --date; | ||||
| 		/* 1 = Jan 1 1900 in Gregorian */ | ||||
| 		var d = new Date(1900, 0, 1); | ||||
| 		d.setDate(d.getDate() + date - 1); | ||||
| 		dout = [d.getFullYear(), d.getMonth()+1,d.getDate()]; | ||||
| 		dow = d.getDay(); | ||||
| 		if(date < 60) dow = (dow + 6) % 7; | ||||
| 		if(b2) dow = fix_hijri(d, dout); | ||||
| 	} | ||||
| 	out.y = dout[0]; out.m = dout[1]; out.d = dout[2]; | ||||
| 	out.S = time % 60; time = Math.floor(time / 60); | ||||
| 	out.M = time % 60; time = Math.floor(time / 60); | ||||
| 	out.H = time; | ||||
| 	out.q = dow; | ||||
| 	return out; | ||||
| } | ||||
| SSF.parse_date_code = parse_date_code; | ||||
| var basedate = new Date(1899, 11, 31, 0, 0, 0); | ||||
| var dnthresh = basedate.getTime(); | ||||
| var base1904 = new Date(1900, 2, 1, 0, 0, 0); | ||||
| function datenum_local(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch -= 1461*24*60*60*1000; | ||||
| 	else if(v >= base1904) epoch += 24*60*60*1000; | ||||
| 	return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
| /* The longest 32-bit integer text is "-4294967296", exactly 11 chars */ | ||||
| function general_fmt_int(v/*:number*/)/*:string*/ { return v.toString(10); } | ||||
| SSF._general_int = general_fmt_int; | ||||
| 
 | ||||
| /* ECMA-376 18.8.30 numFmt*/ | ||||
| /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */ | ||||
| var general_fmt_num = (function make_general_fmt_num() { | ||||
| 	var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/; | ||||
| 	function strip_decimal(o/*:string*/)/*:string*/ { | ||||
| 		return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1"); | ||||
| 	} | ||||
| 
 | ||||
| 	/* General Exponential always shows 2 digits exp and trims the mantissa */ | ||||
| 	var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/; | ||||
| 	var exp_with_single_digit = /(E[+-])(\d)$/; | ||||
| 	function normalize_exp(o/*:string*/)/*:string*/ { | ||||
| 		if(o.indexOf("E") == -1) return o; | ||||
| 		return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2"); | ||||
| 	} | ||||
| 
 | ||||
| 	/* exponent >= -9 and <= 9 */ | ||||
| 	function small_exp(v/*:number*/)/*:string*/ { | ||||
| 		var w = (v<0?12:11); | ||||
| 		var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o; | ||||
| 		o = v.toPrecision(10); if(o.length <= w) return o; | ||||
| 		return v.toExponential(5); | ||||
| 	} | ||||
| 
 | ||||
| 	/* exponent >= 11 or <= -10 likely exponential */ | ||||
| 	function large_exp(v/*:number*/)/*:string*/ { | ||||
| 		var o = strip_decimal(v.toFixed(11)); | ||||
| 		return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o; | ||||
| 	} | ||||
| 
 | ||||
| 	function general_fmt_num_base(v/*:number*/)/*:string*/ { | ||||
| 		var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o; | ||||
| 
 | ||||
| 		if(V >= -4 && V <= -1) o = v.toPrecision(10+V); | ||||
| 		else if(Math.abs(V) <= 9) o = small_exp(v); | ||||
| 		else if(V === 10) o = v.toFixed(10).substr(0,12); | ||||
| 		else o = large_exp(v); | ||||
| 
 | ||||
| 		return strip_decimal(normalize_exp(o.toUpperCase())); | ||||
| 	} | ||||
| 
 | ||||
| 	return general_fmt_num_base; | ||||
| })(); | ||||
| SSF._general_num = general_fmt_num; | ||||
| 
 | ||||
| /* | ||||
| 	"General" rules: | ||||
| 	- text is passed through ("@") | ||||
| 	- booleans are rendered as TRUE/FALSE | ||||
| 	- "up to 11 characters" displayed for numbers | ||||
| 	- Default date format (code 14) used for Dates | ||||
| 
 | ||||
| 	TODO: technically the display depends on the width of the cell | ||||
| */ | ||||
| function general_fmt(v/*:any*/, opts/*:any*/) { | ||||
| 	switch(typeof v) { | ||||
| 		case 'string': return v; | ||||
| 		case 'boolean': return v ? "TRUE" : "FALSE"; | ||||
| 		case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v); | ||||
| 		case 'undefined': return ""; | ||||
| 		case 'object': | ||||
| 			if(v == null) return ""; | ||||
| 			if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts); | ||||
| 	} | ||||
| 	throw new Error("unsupported value in General format: " + v); | ||||
| } | ||||
| SSF._general = general_fmt; | ||||
| function fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) { | ||||
|   /* TODO: properly adjust y/m/d and  */ | ||||
|   o[0] -= 581; | ||||
|   var dow = date.getDay(); | ||||
|   if(date < 60) dow = (dow + 6) % 7; | ||||
|   return dow; | ||||
| } | ||||
| var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split(""); | ||||
| /*jshint -W086 */ | ||||
| function write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ { | ||||
| 	var o="", ss=0, tt=0, y = val.y, out, outl = 0; | ||||
| 	switch(type) { | ||||
| 		case 98: /* 'b' buddhist year */ | ||||
| 			y = val.y + 543; | ||||
| 			/* falls through */ | ||||
| 		case 121: /* 'y' year */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = y % 100; outl = 2; break; | ||||
| 			default: out = y % 10000; outl = 4; break; | ||||
| 		} break; | ||||
| 		case 109: /* 'm' month */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.m; outl = fmt.length; break; | ||||
| 			case 3: return months[val.m-1][1]; | ||||
| 			case 5: return months[val.m-1][0]; | ||||
| 			default: return months[val.m-1][2]; | ||||
| 		} break; | ||||
| 		case 100: /* 'd' day */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.d; outl = fmt.length; break; | ||||
| 			case 3: return days[val.q][0]; | ||||
| 			default: return days[val.q][1]; | ||||
| 		} break; | ||||
| 		case 104: /* 'h' 12-hour */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break; | ||||
| 			default: throw 'bad hour format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 72: /* 'H' 24-hour */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.H; outl = fmt.length; break; | ||||
| 			default: throw 'bad hour format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 77: /* 'M' minutes */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.M; outl = fmt.length; break; | ||||
| 			default: throw 'bad minute format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 115: /* 's' seconds */ | ||||
| 			if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt; | ||||
| 			if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length); | ||||
| 			/*::if(!ss0) ss0 = 0; */ | ||||
| 			if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100; | ||||
| 			else tt = ss0 === 1 ? 10 : 1; | ||||
| 			ss = Math.round((tt)*(val.S + val.u)); | ||||
| 			if(ss >= 60*tt) ss = 0; | ||||
| 			if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt; | ||||
| 			o = pad0(ss,2 + ss0); | ||||
| 			if(fmt === 'ss') return o.substr(0,2); | ||||
| 			return "." + o.substr(2,fmt.length-1); | ||||
| 		case 90: /* 'Z' absolute time */ | ||||
| 		switch(fmt) { | ||||
| 			case '[h]': case '[hh]': out = val.D*24+val.H; break; | ||||
| 			case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break; | ||||
| 			case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break; | ||||
| 			default: throw 'bad abstime format: ' + fmt; | ||||
| 		} outl = fmt.length === 3 ? 1 : 2; break; | ||||
| 		case 101: /* 'e' era */ | ||||
| 			out = y; outl = 1; break; | ||||
| 	} | ||||
| 	var outstr = outl > 0 ? pad0(out, outl) : ""; | ||||
| 	return outstr; | ||||
| } | ||||
| /*jshint +W086 */ | ||||
| function commaify(s/*:string*/)/*:string*/ { | ||||
| 	var w = 3; | ||||
| 	if(s.length <= w) return s; | ||||
| 	var j = (s.length % w), o = s.substr(0,j); | ||||
| 	for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w); | ||||
| 	return o; | ||||
| } | ||||
| var write_num/*:SSF_write_num*/ = (function make_write_num(){ | ||||
| var pct1 = /%/g; | ||||
| function write_num_pct(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; | ||||
| 	return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); | ||||
| } | ||||
| function write_num_cm(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var idx = fmt.length - 1; | ||||
| 	while(fmt.charCodeAt(idx-1) === 44) --idx; | ||||
| 	return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); | ||||
| } | ||||
| function write_num_exp(fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var o/*:string*/; | ||||
| 	var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; | ||||
| 	if(fmt.match(/^#+0.0E\+0$/)) { | ||||
| 		if(val == 0) return "0.0E+0"; | ||||
| 		else if(val < 0) return "-" + write_num_exp(fmt, -val); | ||||
| 		var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); | ||||
| 		var ee = Math.floor(Math.log(val)*Math.LOG10E)%period; | ||||
| 		if(ee < 0) ee += period; | ||||
| 		o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); | ||||
| 		if(o.indexOf("e") === -1) { | ||||
| 			var fakee = Math.floor(Math.log(val)*Math.LOG10E); | ||||
| 			if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee); | ||||
| 			else o += "E+" + (fakee - ee); | ||||
| 			while(o.substr(0,2) === "0.") { | ||||
| 				o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period); | ||||
| 				o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0."); | ||||
| 			} | ||||
| 			o = o.replace(/\+-/,"-"); | ||||
| 		} | ||||
| 		o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); | ||||
| 	} else o = val.toExponential(idx); | ||||
| 	if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1); | ||||
| 	if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | ||||
| 	return o.replace("e","E"); | ||||
| } | ||||
| var frac1 = /# (\?+)( ?)\/( ?)(\d+)/; | ||||
| function write_num_f1(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ { | ||||
| 	var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den); | ||||
| 	var myn = (rr - base*den), myd = den; | ||||
| 	return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length)); | ||||
| } | ||||
| function write_num_f2(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ { | ||||
| 	return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length); | ||||
| } | ||||
| var dec1 = /^#*0*\.([0#]+)/; | ||||
| var closeparen = /\).*[0#]/; | ||||
| var phone = /\(###\) ###\\?-####/; | ||||
| function hashq(str/*:string*/)/*:string*/ { | ||||
| 	var o = "", cc; | ||||
| 	for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) { | ||||
| 		case 35: break; | ||||
| 		case 63: o+= " "; break; | ||||
| 		case 48: o+= "0"; break; | ||||
| 		default: o+= String.fromCharCode(cc); | ||||
| 	} | ||||
| 	return o; | ||||
| } | ||||
| function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); } | ||||
| function dec(val/*:number*/, d/*:number*/)/*:number*/ { | ||||
| 	var _frac = val - Math.floor(val), dd = Math.pow(10,d); | ||||
| 	if (d < ('' + Math.round(_frac * dd)).length) return 0; | ||||
| 	return Math.round(_frac * dd); | ||||
| } | ||||
| function carry(val/*:number*/, d/*:number*/)/*:number*/ { | ||||
| 	if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) { | ||||
| 		return 1; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| function flr(val/*:number*/)/*:string*/ { | ||||
| 	if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0)); | ||||
| 	return ""+Math.floor(val); | ||||
| } | ||||
| function write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ { | ||||
| 	if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { | ||||
| 		var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); | ||||
| 		if(val >= 0) return write_num_flt('n', ffmt, val); | ||||
| 		return '(' + write_num_flt('n', ffmt, -val) + ')'; | ||||
| 	} | ||||
| 	if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val); | ||||
| 	if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val); | ||||
| 	if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val); | ||||
| 	if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val); | ||||
| 	var o; | ||||
| 	var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; | ||||
| 	if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length); | ||||
| 	if(fmt.match(/^[#?]+$/)) { | ||||
| 		o = pad0r(val,0); if(o === "0") o = ""; | ||||
| 		return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign); | ||||
| 	if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0")); | ||||
| 	if((r = fmt.match(dec1))) { | ||||
| 		o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(/*::(*/r/*::||[""])*/[1]).length-$1.length); }); | ||||
| 		return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); | ||||
| 	} | ||||
| 	fmt = fmt.replace(/^#+([0.])/, "$1"); | ||||
| 	if((r = fmt.match(/^(0*)\.(#*)$/))) { | ||||
| 		return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0)); | ||||
| 	if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val); | ||||
| 	if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) { | ||||
| 		o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val)); | ||||
| 		ri = 0; | ||||
| 		return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";})); | ||||
| 	} | ||||
| 	if(fmt.match(phone)) { | ||||
| 		o = write_num_flt(type, "##########", val); | ||||
| 		return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6); | ||||
| 	} | ||||
| 	var oa = ""; | ||||
| 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(/*::String(*/r[4]/*::)*/.length,7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, false); | ||||
| 		o = "" + sign; | ||||
| 		oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]); | ||||
| 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0"; | ||||
| 		o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/; | ||||
| 		oa = rpad_(ff[2],ri); | ||||
| 		if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa; | ||||
| 		o += oa; | ||||
| 		return o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, true); | ||||
| 		return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^[#0?]+$/))) { | ||||
| 		o = pad0r(val, 0); | ||||
| 		if(fmt.length <= o.length) return o; | ||||
| 		return hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^([#0?]+)\.([#0]+)$/))) { | ||||
| 		o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1"); | ||||
| 		ri = o.indexOf("."); | ||||
| 		var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; | ||||
| 		return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^00,000\.([#0]*0)$/))) { | ||||
| 		ri = dec(val, r[1].length); | ||||
| 		return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length); | ||||
| 	} | ||||
| 	switch(fmt) { | ||||
| 		case "###,##0.00": return write_num_flt(type, "#,##0.00", val); | ||||
| 		case "###,###": | ||||
| 		case "##,###": | ||||
| 		case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : ""; | ||||
| 		case "###,###.00": return write_num_flt(type, "###,##0.00",val).replace(/^0\./,"."); | ||||
| 		case "#,###.00": return write_num_flt(type, "#,##0.00",val).replace(/^0\./,"."); | ||||
| 		default: | ||||
| 	} | ||||
| 	throw new Error("unsupported format |" + fmt + "|"); | ||||
| } | ||||
| function write_num_cm2(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var idx = fmt.length - 1; | ||||
| 	while(fmt.charCodeAt(idx-1) === 44) --idx; | ||||
| 	return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); | ||||
| } | ||||
| function write_num_pct2(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; | ||||
| 	return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); | ||||
| } | ||||
| function write_num_exp2(fmt/*:string*/, val/*:number*/)/*:string*/{ | ||||
| 	var o/*:string*/; | ||||
| 	var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; | ||||
| 	if(fmt.match(/^#+0.0E\+0$/)) { | ||||
| 		if(val == 0) return "0.0E+0"; | ||||
| 		else if(val < 0) return "-" + write_num_exp2(fmt, -val); | ||||
| 		var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); | ||||
| 		var ee = Math.floor(Math.log(val)*Math.LOG10E)%period; | ||||
| 		if(ee < 0) ee += period; | ||||
| 		o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); | ||||
| 		if(!o.match(/[Ee]/)) { | ||||
| 			var fakee = Math.floor(Math.log(val)*Math.LOG10E); | ||||
| 			if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee); | ||||
| 			else o += "E+" + (fakee - ee); | ||||
| 			o = o.replace(/\+-/,"-"); | ||||
| 		} | ||||
| 		o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); | ||||
| 	} else o = val.toExponential(idx); | ||||
| 	if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1); | ||||
| 	if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | ||||
| 	return o.replace("e","E"); | ||||
| } | ||||
| function write_num_int(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ { | ||||
| 	if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { | ||||
| 		var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); | ||||
| 		if(val >= 0) return write_num_int('n', ffmt, val); | ||||
| 		return '(' + write_num_int('n', ffmt, -val) + ')'; | ||||
| 	} | ||||
| 	if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val); | ||||
| 	if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val); | ||||
| 	if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val); | ||||
| 	if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val); | ||||
| 	var o; | ||||
| 	var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; | ||||
| 	if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length); | ||||
| 	if(fmt.match(/^[#?]+$/)) { | ||||
| 		o = (""+val); if(val === 0) o = ""; | ||||
| 		return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign); | ||||
| 	if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0")); | ||||
| 	if((r = fmt.match(dec1))) { | ||||
| 		/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */ | ||||
| 		o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])); | ||||
| 		o = o.replace(/\.(\d*)$/,function($$, $1) { | ||||
| 		/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */ | ||||
| 			return "." + $1 + fill("0", hashq(r[1]).length-$1.length); }); | ||||
| 		return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); | ||||
| 	} | ||||
| 	fmt = fmt.replace(/^#+([0.])/, "$1"); | ||||
| 	if((r = fmt.match(/^(0*)\.(#*)$/))) { | ||||
| 		return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval)); | ||||
| 	if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val); | ||||
| 	if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) { | ||||
| 		o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val)); | ||||
| 		ri = 0; | ||||
| 		return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";})); | ||||
| 	} | ||||
| 	if(fmt.match(phone)) { | ||||
| 		o = write_num_int(type, "##########", val); | ||||
| 		return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6); | ||||
| 	} | ||||
| 	var oa = ""; | ||||
| 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(/*::String(*/r[4]/*::)*/.length,7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, false); | ||||
| 		o = "" + sign; | ||||
| 		oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]); | ||||
| 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0"; | ||||
| 		o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/; | ||||
| 		oa = rpad_(ff[2],ri); | ||||
| 		if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa; | ||||
| 		o += oa; | ||||
| 		return o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, true); | ||||
| 		return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^[#0?]+$/))) { | ||||
| 		o = "" + val; | ||||
| 		if(fmt.length <= o.length) return o; | ||||
| 		return hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) { | ||||
| 		o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1"); | ||||
| 		ri = o.indexOf("."); | ||||
| 		var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; | ||||
| 		return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^00,000\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length); | ||||
| 	} | ||||
| 	switch(fmt) { | ||||
| 		case "###,###": | ||||
| 		case "##,###": | ||||
| 		case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : ""; | ||||
| 		default: | ||||
| 			if(fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0,fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf("."))); | ||||
| 	} | ||||
| 	throw new Error("unsupported format |" + fmt + "|"); | ||||
| } | ||||
| return function write_num(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ { | ||||
| 	return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val); | ||||
| };})(); | ||||
| function split_fmt(fmt/*:string*/)/*:Array<string>*/ { | ||||
| 	var out/*:Array<string>*/ = []; | ||||
| 	var in_str = false/*, cc*/; | ||||
| 	for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) { | ||||
| 		case 34: /* '"' */ | ||||
| 			in_str = !in_str; break; | ||||
| 		case 95: case 42: case 92: /* '_' '*' '\\' */ | ||||
| 			++i; break; | ||||
| 		case 59: /* ';' */ | ||||
| 			out[out.length] = fmt.substr(j,i-j); | ||||
| 			j = i+1; | ||||
| 	} | ||||
| 	out[out.length] = fmt.substr(j); | ||||
| 	if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string "); | ||||
| 	return out; | ||||
| } | ||||
| SSF._split = split_fmt; | ||||
| var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/; | ||||
| function fmt_is_date(fmt/*:string*/)/*:boolean*/ { | ||||
| 	var i = 0, /*cc = 0,*/ c = "", o = ""; | ||||
| 	while(i < fmt.length) { | ||||
| 		switch((c = fmt.charAt(i))) { | ||||
| 			case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break; | ||||
| 			case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break; | ||||
| 			case '\\': i+=2; break; | ||||
| 			case '_': i+=2; break; | ||||
| 			case '@': ++i; break; | ||||
| 			case 'B': case 'b': | ||||
| 				if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true; | ||||
| 				/* falls through */ | ||||
| 			case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | ||||
| 				/* falls through */ | ||||
| 			case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true; | ||||
| 			case 'A': case 'a': case '上': | ||||
| 				if(fmt.substr(i, 3).toUpperCase() === "A/P") return true; | ||||
| 				if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true; | ||||
| 				if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true; | ||||
| 				++i; break; | ||||
| 			case '[': | ||||
| 				o = c; | ||||
| 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i); | ||||
| 				if(o.match(abstime)) return true; | ||||
| 				break; | ||||
| 			case '.': | ||||
| 				/* falls through */ | ||||
| 			case '0': case '#': | ||||
| 				while(i < fmt.length && ("0#?.,E+-%".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\' && fmt.charAt(i+1) == "-" && "0#".indexOf(fmt.charAt(i+2))>-1))){/* empty */} | ||||
| 				break; | ||||
| 			case '?': while(fmt.charAt(++i) === c){/* empty */} break; | ||||
| 			case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; | ||||
| 			case '(': case ')': ++i; break; | ||||
| 			case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': | ||||
| 				while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break; | ||||
| 			case ' ': ++i; break; | ||||
| 			default: ++i; break; | ||||
| 		} | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| SSF.is_date = fmt_is_date; | ||||
| function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) { | ||||
| 	var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc; | ||||
| 	var hr='H'; | ||||
| 	/* Tokenize */ | ||||
| 	while(i < fmt.length) { | ||||
| 		switch((c = fmt.charAt(i))) { | ||||
| 			case 'G': /* General */ | ||||
| 				if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt); | ||||
| 				out[out.length] = {t:'G', v:'General'}; i+=7; break; | ||||
| 			case '"': /* Literal text */ | ||||
| 				for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc); | ||||
| 				out[out.length] = {t:'t', v:o}; ++i; break; | ||||
| 			case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't'; | ||||
| 				out[out.length] = {t:t, v:w}; ++i; break; | ||||
| 			case '_': out[out.length] = {t:'t', v:" "}; i+=2; break; | ||||
| 			case '@': /* Text Placeholder */ | ||||
| 				out[out.length] = {t:'T', v:v}; ++i; break; | ||||
| 			case 'B': case 'b': | ||||
| 				if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") { | ||||
| 					if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; } | ||||
| 					out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break; | ||||
| 				} | ||||
| 				/* falls through */ | ||||
| 			case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | ||||
| 				c = c.toLowerCase(); | ||||
| 				/* falls through */ | ||||
| 			case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': | ||||
| 				if(v < 0) return ""; | ||||
| 				if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; } | ||||
| 				o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c; | ||||
| 				if(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; | ||||
| 				if(c === 'h') c = hr; | ||||
| 				out[out.length] = {t:c, v:o}; lst = c; break; | ||||
| 			case 'A': case 'a': case '上': | ||||
| 				var q={t:c, v:c}; | ||||
| 				if(dt==null) dt=parse_date_code(v, opts); | ||||
| 				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} | ||||
| 				else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } | ||||
| 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; } | ||||
| 				else { q.t = "t"; ++i; } | ||||
| 				if(dt==null && q.t === 'T') return ""; | ||||
| 				out[out.length] = q; lst = c; break; | ||||
| 			case '[': | ||||
| 				o = c; | ||||
| 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i); | ||||
| 				if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|'; | ||||
| 				if(o.match(abstime)) { | ||||
| 					if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; } | ||||
| 					out[out.length] = {t:'Z', v:o.toLowerCase()}; | ||||
| 					lst = o.charAt(1); | ||||
| 				} else if(o.indexOf("$") > -1) { | ||||
| 					o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$"; | ||||
| 					if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o}; | ||||
| 				} | ||||
| 				break; | ||||
| 			/* Numbers */ | ||||
| 			case '.': | ||||
| 				if(dt != null) { | ||||
| 					o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c; | ||||
| 					out[out.length] = {t:'s', v:o}; break; | ||||
| 				} | ||||
| 				/* falls through */ | ||||
| 			case '0': case '#': | ||||
| 				o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c; | ||||
| 				out[out.length] = {t:'n', v:o}; break; | ||||
| 			case '?': | ||||
| 				o = c; while(fmt.charAt(++i) === c) o+=c; | ||||
| 				out[out.length] = {t:c, v:o}; lst = c; break; | ||||
| 			case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **
 | ||||
| 			case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break; | ||||
| 			case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': | ||||
| 				o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i); | ||||
| 				out[out.length] = {t:'D', v:o}; break; | ||||
| 			case ' ': out[out.length] = {t:c, v:c}; ++i; break; | ||||
| 			case '$': out[out.length] = {t:'t', v:'$'}; ++i; break; | ||||
| 			default: | ||||
| 				if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt); | ||||
| 				out[out.length] = {t:'t', v:c}; ++i; break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Scan for date/time parts */ | ||||
| 	var bt = 0, ss0 = 0, ssm; | ||||
| 	for(i=out.length-1, lst='t'; i >= 0; --i) { | ||||
| 		switch(out[i].t) { | ||||
| 			case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break; | ||||
| 			case 's': | ||||
| 				if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1); | ||||
| 				if(bt < 3) bt = 3; | ||||
| 			/* falls through */ | ||||
| 			case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break; | ||||
| 			case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break; | ||||
| 			case 'X': /*if(out[i].v === "B2");*/ | ||||
| 				break; | ||||
| 			case 'Z': | ||||
| 				if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1; | ||||
| 				if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2; | ||||
| 				if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3; | ||||
| 		} | ||||
| 	} | ||||
| 	/* time rounding depends on presence of minute / second / usec fields */ | ||||
| 	switch(bt) { | ||||
| 		case 0: break; | ||||
| 		case 1: | ||||
| 			/*::if(!dt) break;*/ | ||||
| 			if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } | ||||
| 			if(dt.S >=  60) { dt.S = 0; ++dt.M; } | ||||
| 			if(dt.M >=  60) { dt.M = 0; ++dt.H; } | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			/*::if(!dt) break;*/ | ||||
| 			if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } | ||||
| 			if(dt.S >=  60) { dt.S = 0; ++dt.M; } | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* replace fields */ | ||||
| 	var nstr = "", jj; | ||||
| 	for(i=0; i < out.length; ++i) { | ||||
| 		switch(out[i].t) { | ||||
| 			case 't': case 'T': case ' ': case 'D': break; | ||||
| 			case 'X': out[i].v = ""; out[i].t = ";"; break; | ||||
| 			case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z': | ||||
| 				/*::if(!dt) throw "unreachable"; */ | ||||
| 				out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0); | ||||
| 				out[i].t = 't'; break; | ||||
| 			case 'n': case '?': | ||||
| 				jj = i+1; | ||||
| 				while(out[jj] != null && ( | ||||
| 					(c=out[jj].t) === "?" || c === "D" || | ||||
| 					((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) || | ||||
| 					(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) || | ||||
| 					(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?')) | ||||
| 				)) { | ||||
| 					out[i].v += out[jj].v; | ||||
| 					out[jj] = {v:"", t:";"}; ++jj; | ||||
| 				} | ||||
| 				nstr += out[i].v; | ||||
| 				i = jj-1; break; | ||||
| 			case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break; | ||||
| 		} | ||||
| 	} | ||||
| 	var vv = "", myv, ostr; | ||||
| 	if(nstr.length > 0) { | ||||
| 		if(nstr.charCodeAt(0) == 40) /* '(' */ { | ||||
| 			myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); | ||||
| 			ostr = write_num('n', nstr, myv); | ||||
| 		} else { | ||||
| 			myv = (v<0 && flen > 1 ? -v : v); | ||||
| 			ostr = write_num('n', nstr, myv); | ||||
| 			if(myv < 0 && out[0] && out[0].t == 't') { | ||||
| 				ostr = ostr.substr(1); | ||||
| 				out[0].v = "-" + out[0].v; | ||||
| 			} | ||||
| 		} | ||||
| 		jj=ostr.length-1; | ||||
| 		var decpt = out.length; | ||||
| 		for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; } | ||||
| 		var lasti=out.length; | ||||
| 		if(decpt === out.length && ostr.indexOf("E") === -1) { | ||||
| 			for(i=out.length-1; i>= 0;--i) { | ||||
| 				if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue; | ||||
| 				if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); } | ||||
| 				else if(jj < 0) out[i].v = ""; | ||||
| 				else { out[i].v = ostr.substr(0, jj+1); jj = -1; } | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 			if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v; | ||||
| 		} | ||||
| 		else if(decpt !== out.length && ostr.indexOf("E") === -1) { | ||||
| 			jj = ostr.indexOf(".")-1; | ||||
| 			for(i=decpt; i>= 0; --i) { | ||||
| 				if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue; | ||||
| 				j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1; | ||||
| 				vv = out[i].v.substr(j+1); | ||||
| 				for(; j>=0; --j) { | ||||
| 					if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv; | ||||
| 				} | ||||
| 				out[i].v = vv; | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 			if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v; | ||||
| 			jj = ostr.indexOf(".")+1; | ||||
| 			for(i=decpt; i<out.length; ++i) { | ||||
| 				if(out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue; | ||||
| 				j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0; | ||||
| 				vv = out[i].v.substr(0,j); | ||||
| 				for(; j<out[i].v.length; ++j) { | ||||
| 					if(jj<ostr.length) vv += ostr.charAt(jj++); | ||||
| 				} | ||||
| 				out[i].v = vv; | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	for(i=0; i<out.length; ++i) if(out[i] != null && 'n?'.indexOf(out[i].t)>-1) { | ||||
| 		myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v); | ||||
| 		out[i].v = write_num(out[i].t, out[i].v, myv); | ||||
| 		out[i].t = 't'; | ||||
| 	} | ||||
| 	var retval = ""; | ||||
| 	for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v; | ||||
| 	return retval; | ||||
| } | ||||
| SSF._eval = eval_fmt; | ||||
| var cfregex = /\[[=<>]/; | ||||
| var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/; | ||||
| function chkcond(v, rr) { | ||||
| 	if(rr == null) return false; | ||||
| 	var thresh = parseFloat(rr[2]); | ||||
| 	switch(rr[1]) { | ||||
| 		case "=":  if(v == thresh) return true; break; | ||||
| 		case ">":  if(v >  thresh) return true; break; | ||||
| 		case "<":  if(v <  thresh) return true; break; | ||||
| 		case "<>": if(v != thresh) return true; break; | ||||
| 		case ">=": if(v >= thresh) return true; break; | ||||
| 		case "<=": if(v <= thresh) return true; break; | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| function choose_fmt(f/*:string*/, v/*:any*/) { | ||||
| 	var fmt = split_fmt(f); | ||||
| 	var l = fmt.length, lat = fmt[l-1].indexOf("@"); | ||||
| 	if(l<4 && lat>-1) --l; | ||||
| 	if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|"); | ||||
| 	if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"]; | ||||
| 	switch(fmt.length) { | ||||
| 		case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break; | ||||
| 		case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break; | ||||
| 		case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break; | ||||
| 		case 4: break; | ||||
| 	} | ||||
| 	var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2]; | ||||
| 	if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff]; | ||||
| 	if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) { | ||||
| 		var m1 = fmt[0].match(cfregex2); | ||||
| 		var m2 = fmt[1].match(cfregex2); | ||||
| 		return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]]; | ||||
| 	} | ||||
| 	return [l, ff]; | ||||
| } | ||||
| function format(fmt/*:string|number*/,v/*:any*/,o/*:?any*/) { | ||||
| 	if(o == null) o = {}; | ||||
| 	var sfmt = ""; | ||||
| 	switch(typeof fmt) { | ||||
| 		case "string": | ||||
| 			if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF; | ||||
| 			else sfmt = fmt; | ||||
| 			break; | ||||
| 		case "number": | ||||
| 			if(fmt == 14 && o.dateNF) sfmt = o.dateNF; | ||||
| 			else sfmt = (o.table != null ? (o.table/*:any*/) : table_fmt)[fmt]; | ||||
| 			if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]]; | ||||
| 			if(sfmt == null) sfmt = default_str[fmt] || "General"; | ||||
| 			break; | ||||
| 	} | ||||
| 	if(isgeneral(sfmt,0)) return general_fmt(v, o); | ||||
| 	if(v instanceof Date) v = datenum_local(v, o.date1904); | ||||
| 	var f = choose_fmt(sfmt, v); | ||||
| 	if(isgeneral(f[1])) return general_fmt(v, o); | ||||
| 	if(v === true) v = "TRUE"; else if(v === false) v = "FALSE"; | ||||
| 	else if(v === "" || v == null) return ""; | ||||
| 	return eval_fmt(f[1], v, o, f[0]); | ||||
| } | ||||
| function load_entry(fmt/*:string*/, idx/*:?number*/)/*:number*/ { | ||||
| 	if(typeof idx != 'number') { | ||||
| 		idx = +idx || -1; | ||||
| /*::if(typeof idx != 'number') return 0x188; */ | ||||
| 		for(var i = 0; i < 0x0188; ++i) { | ||||
| /*::if(typeof idx != 'number') return 0x188; */ | ||||
| 			if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; } | ||||
| 			if(table_fmt[i] == fmt) { idx = i; break; } | ||||
| 		} | ||||
| /*::if(typeof idx != 'number') return 0x188; */ | ||||
| 		if(idx < 0) idx = 0x187; | ||||
| 	} | ||||
| /*::if(typeof idx != 'number') return 0x188; */ | ||||
| 	table_fmt[idx] = fmt; | ||||
| 	return idx; | ||||
| } | ||||
| SSF.load = load_entry; | ||||
| SSF._table = table_fmt; | ||||
| SSF.get_table = function get_table()/*:SSFTable*/ { return table_fmt; }; | ||||
| SSF.load_table = function load_table(tbl/*:SSFTable*/)/*:void*/ { | ||||
| 	for(var i=0; i!=0x0188; ++i) | ||||
| 		if(tbl[i] !== undefined) load_entry(tbl[i], i); | ||||
| }; | ||||
| SSF.init_table = init_table; | ||||
| SSF.format = format; | ||||
| }; | ||||
| make_ssf(SSF); | ||||
| /*global module */ | ||||
| if(typeof module !== 'undefined' && typeof DO_NOT_EXPORT_SSF === 'undefined') module.exports = SSF; | ||||
							
								
								
									
										966
									
								
								packages/ssf/ssf.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										966
									
								
								packages/ssf/ssf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,966 @@ | ||||
| /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint -W041 */ | ||||
| var SSF = ({}); | ||||
| var make_ssf = function make_ssf(SSF){ | ||||
| SSF.version = '0.11.2'; | ||||
| function _strrev(x) { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; } | ||||
| function fill(c,l) { var o = ""; while(o.length < l) o+=c; return o; } | ||||
| function pad0(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| function pad_(v,d){var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;} | ||||
| function rpad_(v,d){var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);} | ||||
| function pad0r1(v,d){var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| function pad0r2(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;} | ||||
| var p2_32 = Math.pow(2,32); | ||||
| function pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); } | ||||
| function isgeneral(s, i) { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; } | ||||
| var days = [ | ||||
| 	['Sun', 'Sunday'], | ||||
| 	['Mon', 'Monday'], | ||||
| 	['Tue', 'Tuesday'], | ||||
| 	['Wed', 'Wednesday'], | ||||
| 	['Thu', 'Thursday'], | ||||
| 	['Fri', 'Friday'], | ||||
| 	['Sat', 'Saturday'] | ||||
| ]; | ||||
| var months = [ | ||||
| 	['J', 'Jan', 'January'], | ||||
| 	['F', 'Feb', 'February'], | ||||
| 	['M', 'Mar', 'March'], | ||||
| 	['A', 'Apr', 'April'], | ||||
| 	['M', 'May', 'May'], | ||||
| 	['J', 'Jun', 'June'], | ||||
| 	['J', 'Jul', 'July'], | ||||
| 	['A', 'Aug', 'August'], | ||||
| 	['S', 'Sep', 'September'], | ||||
| 	['O', 'Oct', 'October'], | ||||
| 	['N', 'Nov', 'November'], | ||||
| 	['D', 'Dec', 'December'] | ||||
| ]; | ||||
| function init_table(t) { | ||||
| 	t[0]=  'General'; | ||||
| 	t[1]=  '0'; | ||||
| 	t[2]=  '0.00'; | ||||
| 	t[3]=  '#,##0'; | ||||
| 	t[4]=  '#,##0.00'; | ||||
| 	t[9]=  '0%'; | ||||
| 	t[10]= '0.00%'; | ||||
| 	t[11]= '0.00E+00'; | ||||
| 	t[12]= '# ?/?'; | ||||
| 	t[13]= '# ??/??'; | ||||
| 	t[14]= 'm/d/yy'; | ||||
| 	t[15]= 'd-mmm-yy'; | ||||
| 	t[16]= 'd-mmm'; | ||||
| 	t[17]= 'mmm-yy'; | ||||
| 	t[18]= 'h:mm AM/PM'; | ||||
| 	t[19]= 'h:mm:ss AM/PM'; | ||||
| 	t[20]= 'h:mm'; | ||||
| 	t[21]= 'h:mm:ss'; | ||||
| 	t[22]= 'm/d/yy h:mm'; | ||||
| 	t[37]= '#,##0 ;(#,##0)'; | ||||
| 	t[38]= '#,##0 ;[Red](#,##0)'; | ||||
| 	t[39]= '#,##0.00;(#,##0.00)'; | ||||
| 	t[40]= '#,##0.00;[Red](#,##0.00)'; | ||||
| 	t[45]= 'mm:ss'; | ||||
| 	t[46]= '[h]:mm:ss'; | ||||
| 	t[47]= 'mmss.0'; | ||||
| 	t[48]= '##0.0E+0'; | ||||
| 	t[49]= '@'; | ||||
| 	t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "'; | ||||
| } | ||||
| 
 | ||||
| var table_fmt = {}; | ||||
| init_table(table_fmt); | ||||
| /* Defaults determined by systematically testing in Excel 2019 */ | ||||
| 
 | ||||
| /* These formats appear to default to other formats in the table */ | ||||
| var default_map = []; | ||||
| var defi = 0; | ||||
| 
 | ||||
| //  5 -> 37 ...  8 -> 40
 | ||||
| for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi; | ||||
| 
 | ||||
| // 23 ->  0 ... 26 ->  0
 | ||||
| for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0; | ||||
| 
 | ||||
| // 27 -> 14 ... 31 -> 14
 | ||||
| for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14; | ||||
| // 50 -> 14 ... 58 -> 14
 | ||||
| for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14; | ||||
| 
 | ||||
| // 59 ->  1 ... 62 ->  4
 | ||||
| for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58; | ||||
| // 67 ->  9 ... 68 -> 10
 | ||||
| for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58; | ||||
| // 72 -> 14 ... 75 -> 17
 | ||||
| for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58; | ||||
| 
 | ||||
| // 69 -> 12 ... 71 -> 14
 | ||||
| for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57; | ||||
| 
 | ||||
| // 76 -> 20 ... 78 -> 22
 | ||||
| for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56; | ||||
| 
 | ||||
| // 79 -> 45 ... 81 -> 47
 | ||||
| for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34; | ||||
| 
 | ||||
| // 82 ->  0 ... 65536 -> 0 (omitted)
 | ||||
| 
 | ||||
| /* These formats technically refer to Accounting formats with no equivalent */ | ||||
| var default_str = []; | ||||
| 
 | ||||
| //  5 -- Currency,   0 decimal, black negative
 | ||||
| default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)'; | ||||
| //  6 -- Currency,   0 decimal, red   negative
 | ||||
| default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)'; | ||||
| //  7 -- Currency,   2 decimal, black negative
 | ||||
| default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)'; | ||||
| //  8 -- Currency,   2 decimal, red   negative
 | ||||
| default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)'; | ||||
| 
 | ||||
| // 41 -- Accounting, 0 decimal, No Symbol
 | ||||
| default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)'; | ||||
| // 42 -- Accounting, 0 decimal, $  Symbol
 | ||||
| default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)'; | ||||
| // 43 -- Accounting, 2 decimal, No Symbol
 | ||||
| default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)'; | ||||
| // 44 -- Accounting, 2 decimal, $  Symbol
 | ||||
| default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'; | ||||
| function frac(x, D, mixed) { | ||||
| 	var sgn = x < 0 ? -1 : 1; | ||||
| 	var B = x * sgn; | ||||
| 	var P_2 = 0, P_1 = 1, P = 0; | ||||
| 	var Q_2 = 1, Q_1 = 0, Q = 0; | ||||
| 	var A = Math.floor(B); | ||||
| 	while(Q_1 < D) { | ||||
| 		A = Math.floor(B); | ||||
| 		P = A * P_1 + P_2; | ||||
| 		Q = A * Q_1 + Q_2; | ||||
| 		if((B - A) < 0.00000005) break; | ||||
| 		B = 1 / (B - A); | ||||
| 		P_2 = P_1; P_1 = P; | ||||
| 		Q_2 = Q_1; Q_1 = Q; | ||||
| 	} | ||||
| 	if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } } | ||||
| 	if(!mixed) return [0, sgn * P, Q]; | ||||
| 	var q = Math.floor(sgn * P/Q); | ||||
| 	return [q, sgn*P - q*Q, Q]; | ||||
| } | ||||
| function parse_date_code(v,opts,b2) { | ||||
| 	if(v > 2958465 || v < 0) return null; | ||||
| 	var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0; | ||||
| 	var dout=[]; | ||||
| 	var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0}; | ||||
| 	if(Math.abs(out.u) < 1e-6) out.u = 0; | ||||
| 	if(opts && opts.date1904) date += 1462; | ||||
| 	if(out.u > 0.9999) { | ||||
| 		out.u = 0; | ||||
| 		if(++time == 86400) { out.T = time = 0; ++date; ++out.D; } | ||||
| 	} | ||||
| 	if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;} | ||||
| 	else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;} | ||||
| 	else { | ||||
| 		if(date > 60) --date; | ||||
| 		/* 1 = Jan 1 1900 in Gregorian */ | ||||
| 		var d = new Date(1900, 0, 1); | ||||
| 		d.setDate(d.getDate() + date - 1); | ||||
| 		dout = [d.getFullYear(), d.getMonth()+1,d.getDate()]; | ||||
| 		dow = d.getDay(); | ||||
| 		if(date < 60) dow = (dow + 6) % 7; | ||||
| 		if(b2) dow = fix_hijri(d, dout); | ||||
| 	} | ||||
| 	out.y = dout[0]; out.m = dout[1]; out.d = dout[2]; | ||||
| 	out.S = time % 60; time = Math.floor(time / 60); | ||||
| 	out.M = time % 60; time = Math.floor(time / 60); | ||||
| 	out.H = time; | ||||
| 	out.q = dow; | ||||
| 	return out; | ||||
| } | ||||
| SSF.parse_date_code = parse_date_code; | ||||
| var basedate = new Date(1899, 11, 31, 0, 0, 0); | ||||
| var dnthresh = basedate.getTime(); | ||||
| var base1904 = new Date(1900, 2, 1, 0, 0, 0); | ||||
| function datenum_local(v, date1904) { | ||||
| 	var epoch = v.getTime(); | ||||
| 	if(date1904) epoch -= 1461*24*60*60*1000; | ||||
| 	else if(v >= base1904) epoch += 24*60*60*1000; | ||||
| 	return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000); | ||||
| } | ||||
| /* The longest 32-bit integer text is "-4294967296", exactly 11 chars */ | ||||
| function general_fmt_int(v) { return v.toString(10); } | ||||
| SSF._general_int = general_fmt_int; | ||||
| 
 | ||||
| /* ECMA-376 18.8.30 numFmt*/ | ||||
| /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */ | ||||
| var general_fmt_num = (function make_general_fmt_num() { | ||||
| 	var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/; | ||||
| 	function strip_decimal(o) { | ||||
| 		return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1"); | ||||
| 	} | ||||
| 
 | ||||
| 	/* General Exponential always shows 2 digits exp and trims the mantissa */ | ||||
| 	var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/; | ||||
| 	var exp_with_single_digit = /(E[+-])(\d)$/; | ||||
| 	function normalize_exp(o) { | ||||
| 		if(o.indexOf("E") == -1) return o; | ||||
| 		return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2"); | ||||
| 	} | ||||
| 
 | ||||
| 	/* exponent >= -9 and <= 9 */ | ||||
| 	function small_exp(v) { | ||||
| 		var w = (v<0?12:11); | ||||
| 		var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o; | ||||
| 		o = v.toPrecision(10); if(o.length <= w) return o; | ||||
| 		return v.toExponential(5); | ||||
| 	} | ||||
| 
 | ||||
| 	/* exponent >= 11 or <= -10 likely exponential */ | ||||
| 	function large_exp(v) { | ||||
| 		var o = strip_decimal(v.toFixed(11)); | ||||
| 		return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o; | ||||
| 	} | ||||
| 
 | ||||
| 	function general_fmt_num_base(v) { | ||||
| 		var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o; | ||||
| 
 | ||||
| 		if(V >= -4 && V <= -1) o = v.toPrecision(10+V); | ||||
| 		else if(Math.abs(V) <= 9) o = small_exp(v); | ||||
| 		else if(V === 10) o = v.toFixed(10).substr(0,12); | ||||
| 		else o = large_exp(v); | ||||
| 
 | ||||
| 		return strip_decimal(normalize_exp(o.toUpperCase())); | ||||
| 	} | ||||
| 
 | ||||
| 	return general_fmt_num_base; | ||||
| })(); | ||||
| SSF._general_num = general_fmt_num; | ||||
| 
 | ||||
| /* | ||||
| 	"General" rules: | ||||
| 	- text is passed through ("@") | ||||
| 	- booleans are rendered as TRUE/FALSE | ||||
| 	- "up to 11 characters" displayed for numbers | ||||
| 	- Default date format (code 14) used for Dates | ||||
| 
 | ||||
| 	TODO: technically the display depends on the width of the cell | ||||
| */ | ||||
| function general_fmt(v, opts) { | ||||
| 	switch(typeof v) { | ||||
| 		case 'string': return v; | ||||
| 		case 'boolean': return v ? "TRUE" : "FALSE"; | ||||
| 		case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v); | ||||
| 		case 'undefined': return ""; | ||||
| 		case 'object': | ||||
| 			if(v == null) return ""; | ||||
| 			if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts); | ||||
| 	} | ||||
| 	throw new Error("unsupported value in General format: " + v); | ||||
| } | ||||
| SSF._general = general_fmt; | ||||
| function fix_hijri(date, o) { | ||||
|   /* TODO: properly adjust y/m/d and  */ | ||||
|   o[0] -= 581; | ||||
|   var dow = date.getDay(); | ||||
|   if(date < 60) dow = (dow + 6) % 7; | ||||
|   return dow; | ||||
| } | ||||
| var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split(""); | ||||
| /*jshint -W086 */ | ||||
| function write_date(type, fmt, val, ss0) { | ||||
| 	var o="", ss=0, tt=0, y = val.y, out, outl = 0; | ||||
| 	switch(type) { | ||||
| 		case 98: /* 'b' buddhist year */ | ||||
| 			y = val.y + 543; | ||||
| 			/* falls through */ | ||||
| 		case 121: /* 'y' year */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = y % 100; outl = 2; break; | ||||
| 			default: out = y % 10000; outl = 4; break; | ||||
| 		} break; | ||||
| 		case 109: /* 'm' month */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.m; outl = fmt.length; break; | ||||
| 			case 3: return months[val.m-1][1]; | ||||
| 			case 5: return months[val.m-1][0]; | ||||
| 			default: return months[val.m-1][2]; | ||||
| 		} break; | ||||
| 		case 100: /* 'd' day */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.d; outl = fmt.length; break; | ||||
| 			case 3: return days[val.q][0]; | ||||
| 			default: return days[val.q][1]; | ||||
| 		} break; | ||||
| 		case 104: /* 'h' 12-hour */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break; | ||||
| 			default: throw 'bad hour format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 72: /* 'H' 24-hour */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.H; outl = fmt.length; break; | ||||
| 			default: throw 'bad hour format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 77: /* 'M' minutes */ | ||||
| 		switch(fmt.length) { | ||||
| 			case 1: case 2: out = val.M; outl = fmt.length; break; | ||||
| 			default: throw 'bad minute format: ' + fmt; | ||||
| 		} break; | ||||
| 		case 115: /* 's' seconds */ | ||||
| 			if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt; | ||||
| 			if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length); | ||||
| if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100; | ||||
| 			else tt = ss0 === 1 ? 10 : 1; | ||||
| 			ss = Math.round((tt)*(val.S + val.u)); | ||||
| 			if(ss >= 60*tt) ss = 0; | ||||
| 			if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt; | ||||
| 			o = pad0(ss,2 + ss0); | ||||
| 			if(fmt === 'ss') return o.substr(0,2); | ||||
| 			return "." + o.substr(2,fmt.length-1); | ||||
| 		case 90: /* 'Z' absolute time */ | ||||
| 		switch(fmt) { | ||||
| 			case '[h]': case '[hh]': out = val.D*24+val.H; break; | ||||
| 			case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break; | ||||
| 			case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break; | ||||
| 			default: throw 'bad abstime format: ' + fmt; | ||||
| 		} outl = fmt.length === 3 ? 1 : 2; break; | ||||
| 		case 101: /* 'e' era */ | ||||
| 			out = y; outl = 1; break; | ||||
| 	} | ||||
| 	var outstr = outl > 0 ? pad0(out, outl) : ""; | ||||
| 	return outstr; | ||||
| } | ||||
| /*jshint +W086 */ | ||||
| function commaify(s) { | ||||
| 	var w = 3; | ||||
| 	if(s.length <= w) return s; | ||||
| 	var j = (s.length % w), o = s.substr(0,j); | ||||
| 	for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w); | ||||
| 	return o; | ||||
| } | ||||
| var write_num = (function make_write_num(){ | ||||
| var pct1 = /%/g; | ||||
| function write_num_pct(type, fmt, val){ | ||||
| 	var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; | ||||
| 	return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); | ||||
| } | ||||
| function write_num_cm(type, fmt, val){ | ||||
| 	var idx = fmt.length - 1; | ||||
| 	while(fmt.charCodeAt(idx-1) === 44) --idx; | ||||
| 	return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); | ||||
| } | ||||
| function write_num_exp(fmt, val){ | ||||
| 	var o; | ||||
| 	var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; | ||||
| 	if(fmt.match(/^#+0.0E\+0$/)) { | ||||
| 		if(val == 0) return "0.0E+0"; | ||||
| 		else if(val < 0) return "-" + write_num_exp(fmt, -val); | ||||
| 		var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); | ||||
| 		var ee = Math.floor(Math.log(val)*Math.LOG10E)%period; | ||||
| 		if(ee < 0) ee += period; | ||||
| 		o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); | ||||
| 		if(o.indexOf("e") === -1) { | ||||
| 			var fakee = Math.floor(Math.log(val)*Math.LOG10E); | ||||
| 			if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee); | ||||
| 			else o += "E+" + (fakee - ee); | ||||
| 			while(o.substr(0,2) === "0.") { | ||||
| 				o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period); | ||||
| 				o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0."); | ||||
| 			} | ||||
| 			o = o.replace(/\+-/,"-"); | ||||
| 		} | ||||
| 		o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); | ||||
| 	} else o = val.toExponential(idx); | ||||
| 	if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1); | ||||
| 	if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | ||||
| 	return o.replace("e","E"); | ||||
| } | ||||
| var frac1 = /# (\?+)( ?)\/( ?)(\d+)/; | ||||
| function write_num_f1(r, aval, sign) { | ||||
| 	var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den); | ||||
| 	var myn = (rr - base*den), myd = den; | ||||
| 	return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length)); | ||||
| } | ||||
| function write_num_f2(r, aval, sign) { | ||||
| 	return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length); | ||||
| } | ||||
| var dec1 = /^#*0*\.([0#]+)/; | ||||
| var closeparen = /\).*[0#]/; | ||||
| var phone = /\(###\) ###\\?-####/; | ||||
| function hashq(str) { | ||||
| 	var o = "", cc; | ||||
| 	for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) { | ||||
| 		case 35: break; | ||||
| 		case 63: o+= " "; break; | ||||
| 		case 48: o+= "0"; break; | ||||
| 		default: o+= String.fromCharCode(cc); | ||||
| 	} | ||||
| 	return o; | ||||
| } | ||||
| function rnd(val, d) { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); } | ||||
| function dec(val, d) { | ||||
| 	var _frac = val - Math.floor(val), dd = Math.pow(10,d); | ||||
| 	if (d < ('' + Math.round(_frac * dd)).length) return 0; | ||||
| 	return Math.round(_frac * dd); | ||||
| } | ||||
| function carry(val, d) { | ||||
| 	if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) { | ||||
| 		return 1; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| function flr(val) { | ||||
| 	if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0)); | ||||
| 	return ""+Math.floor(val); | ||||
| } | ||||
| function write_num_flt(type, fmt, val) { | ||||
| 	if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { | ||||
| 		var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); | ||||
| 		if(val >= 0) return write_num_flt('n', ffmt, val); | ||||
| 		return '(' + write_num_flt('n', ffmt, -val) + ')'; | ||||
| 	} | ||||
| 	if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val); | ||||
| 	if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val); | ||||
| 	if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val); | ||||
| 	if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val); | ||||
| 	var o; | ||||
| 	var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; | ||||
| 	if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length); | ||||
| 	if(fmt.match(/^[#?]+$/)) { | ||||
| 		o = pad0r(val,0); if(o === "0") o = ""; | ||||
| 		return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign); | ||||
| 	if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0")); | ||||
| 	if((r = fmt.match(dec1))) { | ||||
| 		o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(r[1]).length-$1.length); }); | ||||
| 		return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); | ||||
| 	} | ||||
| 	fmt = fmt.replace(/^#+([0.])/, "$1"); | ||||
| 	if((r = fmt.match(/^(0*)\.(#*)$/))) { | ||||
| 		return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0)); | ||||
| 	if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val); | ||||
| 	if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) { | ||||
| 		o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val)); | ||||
| 		ri = 0; | ||||
| 		return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";})); | ||||
| 	} | ||||
| 	if(fmt.match(phone)) { | ||||
| 		o = write_num_flt(type, "##########", val); | ||||
| 		return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6); | ||||
| 	} | ||||
| 	var oa = ""; | ||||
| 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(r[4].length,7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, false); | ||||
| 		o = "" + sign; | ||||
| 		oa = write_num("n", r[1], ff[1]); | ||||
| 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0"; | ||||
| 		o += oa + r[2] + "/" + r[3]; | ||||
| 		oa = rpad_(ff[2],ri); | ||||
| 		if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa; | ||||
| 		o += oa; | ||||
| 		return o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, true); | ||||
| 		return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^[#0?]+$/))) { | ||||
| 		o = pad0r(val, 0); | ||||
| 		if(fmt.length <= o.length) return o; | ||||
| 		return hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^([#0?]+)\.([#0]+)$/))) { | ||||
| 		o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1"); | ||||
| 		ri = o.indexOf("."); | ||||
| 		var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; | ||||
| 		return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^00,000\.([#0]*0)$/))) { | ||||
| 		ri = dec(val, r[1].length); | ||||
| 		return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length); | ||||
| 	} | ||||
| 	switch(fmt) { | ||||
| 		case "###,##0.00": return write_num_flt(type, "#,##0.00", val); | ||||
| 		case "###,###": | ||||
| 		case "##,###": | ||||
| 		case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : ""; | ||||
| 		case "###,###.00": return write_num_flt(type, "###,##0.00",val).replace(/^0\./,"."); | ||||
| 		case "#,###.00": return write_num_flt(type, "#,##0.00",val).replace(/^0\./,"."); | ||||
| 		default: | ||||
| 	} | ||||
| 	throw new Error("unsupported format |" + fmt + "|"); | ||||
| } | ||||
| function write_num_cm2(type, fmt, val){ | ||||
| 	var idx = fmt.length - 1; | ||||
| 	while(fmt.charCodeAt(idx-1) === 44) --idx; | ||||
| 	return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx))); | ||||
| } | ||||
| function write_num_pct2(type, fmt, val){ | ||||
| 	var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length; | ||||
| 	return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul); | ||||
| } | ||||
| function write_num_exp2(fmt, val){ | ||||
| 	var o; | ||||
| 	var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; | ||||
| 	if(fmt.match(/^#+0.0E\+0$/)) { | ||||
| 		if(val == 0) return "0.0E+0"; | ||||
| 		else if(val < 0) return "-" + write_num_exp2(fmt, -val); | ||||
| 		var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E'); | ||||
| 		var ee = Math.floor(Math.log(val)*Math.LOG10E)%period; | ||||
| 		if(ee < 0) ee += period; | ||||
| 		o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period); | ||||
| 		if(!o.match(/[Ee]/)) { | ||||
| 			var fakee = Math.floor(Math.log(val)*Math.LOG10E); | ||||
| 			if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee); | ||||
| 			else o += "E+" + (fakee - ee); | ||||
| 			o = o.replace(/\+-/,"-"); | ||||
| 		} | ||||
| 		o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; }); | ||||
| 	} else o = val.toExponential(idx); | ||||
| 	if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1); | ||||
| 	if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | ||||
| 	return o.replace("e","E"); | ||||
| } | ||||
| function write_num_int(type, fmt, val) { | ||||
| 	if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { | ||||
| 		var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,""); | ||||
| 		if(val >= 0) return write_num_int('n', ffmt, val); | ||||
| 		return '(' + write_num_int('n', ffmt, -val) + ')'; | ||||
| 	} | ||||
| 	if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val); | ||||
| 	if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val); | ||||
| 	if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val); | ||||
| 	if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val); | ||||
| 	var o; | ||||
| 	var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; | ||||
| 	if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length); | ||||
| 	if(fmt.match(/^[#?]+$/)) { | ||||
| 		o = (""+val); if(val === 0) o = ""; | ||||
| 		return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign); | ||||
| 	if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0")); | ||||
| 	if((r = fmt.match(dec1))) { | ||||
| o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])); | ||||
| 		o = o.replace(/\.(\d*)$/,function($$, $1) { | ||||
| return "." + $1 + fill("0", hashq(r[1]).length-$1.length); }); | ||||
| 		return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,"."); | ||||
| 	} | ||||
| 	fmt = fmt.replace(/^#+([0.])/, "$1"); | ||||
| 	if((r = fmt.match(/^(0*)\.(#*)$/))) { | ||||
| 		return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":"."); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval)); | ||||
| 	if((r = fmt.match(/^#,##0\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val); | ||||
| 	if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) { | ||||
| 		o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val)); | ||||
| 		ri = 0; | ||||
| 		return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";})); | ||||
| 	} | ||||
| 	if(fmt.match(phone)) { | ||||
| 		o = write_num_int(type, "##########", val); | ||||
| 		return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6); | ||||
| 	} | ||||
| 	var oa = ""; | ||||
| 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(r[4].length,7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, false); | ||||
| 		o = "" + sign; | ||||
| 		oa = write_num("n", r[1], ff[1]); | ||||
| 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0"; | ||||
| 		o += oa + r[2] + "/" + r[3]; | ||||
| 		oa = rpad_(ff[2],ri); | ||||
| 		if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa; | ||||
| 		o += oa; | ||||
| 		return o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) { | ||||
| 		ri = Math.min(Math.max(r[1].length, r[4].length),7); | ||||
| 		ff = frac(aval, Math.pow(10,ri)-1, true); | ||||
| 		return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^[#0?]+$/))) { | ||||
| 		o = "" + val; | ||||
| 		if(fmt.length <= o.length) return o; | ||||
| 		return hashq(fmt.substr(0,fmt.length-o.length)) + o; | ||||
| 	} | ||||
| 	if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) { | ||||
| 		o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1"); | ||||
| 		ri = o.indexOf("."); | ||||
| 		var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; | ||||
| 		return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres)); | ||||
| 	} | ||||
| 	if((r = fmt.match(/^00,000\.([#0]*0)$/))) { | ||||
| 		return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length); | ||||
| 	} | ||||
| 	switch(fmt) { | ||||
| 		case "###,###": | ||||
| 		case "##,###": | ||||
| 		case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : ""; | ||||
| 		default: | ||||
| 			if(fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0,fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf("."))); | ||||
| 	} | ||||
| 	throw new Error("unsupported format |" + fmt + "|"); | ||||
| } | ||||
| return function write_num(type, fmt, val) { | ||||
| 	return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val); | ||||
| };})(); | ||||
| function split_fmt(fmt) { | ||||
| 	var out = []; | ||||
| 	var in_str = false/*, cc*/; | ||||
| 	for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) { | ||||
| 		case 34: /* '"' */ | ||||
| 			in_str = !in_str; break; | ||||
| 		case 95: case 42: case 92: /* '_' '*' '\\' */ | ||||
| 			++i; break; | ||||
| 		case 59: /* ';' */ | ||||
| 			out[out.length] = fmt.substr(j,i-j); | ||||
| 			j = i+1; | ||||
| 	} | ||||
| 	out[out.length] = fmt.substr(j); | ||||
| 	if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string "); | ||||
| 	return out; | ||||
| } | ||||
| SSF._split = split_fmt; | ||||
| var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/; | ||||
| function fmt_is_date(fmt) { | ||||
| 	var i = 0, /*cc = 0,*/ c = "", o = ""; | ||||
| 	while(i < fmt.length) { | ||||
| 		switch((c = fmt.charAt(i))) { | ||||
| 			case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break; | ||||
| 			case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break; | ||||
| 			case '\\': i+=2; break; | ||||
| 			case '_': i+=2; break; | ||||
| 			case '@': ++i; break; | ||||
| 			case 'B': case 'b': | ||||
| 				if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true; | ||||
| 				/* falls through */ | ||||
| 			case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | ||||
| 				/* falls through */ | ||||
| 			case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true; | ||||
| 			case 'A': case 'a': case '上': | ||||
| 				if(fmt.substr(i, 3).toUpperCase() === "A/P") return true; | ||||
| 				if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true; | ||||
| 				if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true; | ||||
| 				++i; break; | ||||
| 			case '[': | ||||
| 				o = c; | ||||
| 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i); | ||||
| 				if(o.match(abstime)) return true; | ||||
| 				break; | ||||
| 			case '.': | ||||
| 				/* falls through */ | ||||
| 			case '0': case '#': | ||||
| 				while(i < fmt.length && ("0#?.,E+-%".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\' && fmt.charAt(i+1) == "-" && "0#".indexOf(fmt.charAt(i+2))>-1))){/* empty */} | ||||
| 				break; | ||||
| 			case '?': while(fmt.charAt(++i) === c){/* empty */} break; | ||||
| 			case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; | ||||
| 			case '(': case ')': ++i; break; | ||||
| 			case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': | ||||
| 				while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break; | ||||
| 			case ' ': ++i; break; | ||||
| 			default: ++i; break; | ||||
| 		} | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| SSF.is_date = fmt_is_date; | ||||
| function eval_fmt(fmt, v, opts, flen) { | ||||
| 	var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc; | ||||
| 	var hr='H'; | ||||
| 	/* Tokenize */ | ||||
| 	while(i < fmt.length) { | ||||
| 		switch((c = fmt.charAt(i))) { | ||||
| 			case 'G': /* General */ | ||||
| 				if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt); | ||||
| 				out[out.length] = {t:'G', v:'General'}; i+=7; break; | ||||
| 			case '"': /* Literal text */ | ||||
| 				for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc); | ||||
| 				out[out.length] = {t:'t', v:o}; ++i; break; | ||||
| 			case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't'; | ||||
| 				out[out.length] = {t:t, v:w}; ++i; break; | ||||
| 			case '_': out[out.length] = {t:'t', v:" "}; i+=2; break; | ||||
| 			case '@': /* Text Placeholder */ | ||||
| 				out[out.length] = {t:'T', v:v}; ++i; break; | ||||
| 			case 'B': case 'b': | ||||
| 				if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") { | ||||
| 					if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; } | ||||
| 					out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break; | ||||
| 				} | ||||
| 				/* falls through */ | ||||
| 			case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | ||||
| 				c = c.toLowerCase(); | ||||
| 				/* falls through */ | ||||
| 			case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': | ||||
| 				if(v < 0) return ""; | ||||
| 				if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; } | ||||
| 				o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c; | ||||
| 				if(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; | ||||
| 				if(c === 'h') c = hr; | ||||
| 				out[out.length] = {t:c, v:o}; lst = c; break; | ||||
| 			case 'A': case 'a': case '上': | ||||
| 				var q={t:c, v:c}; | ||||
| 				if(dt==null) dt=parse_date_code(v, opts); | ||||
| 				if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} | ||||
| 				else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } | ||||
| 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; } | ||||
| 				else { q.t = "t"; ++i; } | ||||
| 				if(dt==null && q.t === 'T') return ""; | ||||
| 				out[out.length] = q; lst = c; break; | ||||
| 			case '[': | ||||
| 				o = c; | ||||
| 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i); | ||||
| 				if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|'; | ||||
| 				if(o.match(abstime)) { | ||||
| 					if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; } | ||||
| 					out[out.length] = {t:'Z', v:o.toLowerCase()}; | ||||
| 					lst = o.charAt(1); | ||||
| 				} else if(o.indexOf("$") > -1) { | ||||
| 					o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$"; | ||||
| 					if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o}; | ||||
| 				} | ||||
| 				break; | ||||
| 			/* Numbers */ | ||||
| 			case '.': | ||||
| 				if(dt != null) { | ||||
| 					o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c; | ||||
| 					out[out.length] = {t:'s', v:o}; break; | ||||
| 				} | ||||
| 				/* falls through */ | ||||
| 			case '0': case '#': | ||||
| 				o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c; | ||||
| 				out[out.length] = {t:'n', v:o}; break; | ||||
| 			case '?': | ||||
| 				o = c; while(fmt.charAt(++i) === c) o+=c; | ||||
| 				out[out.length] = {t:c, v:o}; lst = c; break; | ||||
| 			case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **
 | ||||
| 			case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break; | ||||
| 			case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': | ||||
| 				o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i); | ||||
| 				out[out.length] = {t:'D', v:o}; break; | ||||
| 			case ' ': out[out.length] = {t:c, v:c}; ++i; break; | ||||
| 			case '$': out[out.length] = {t:'t', v:'$'}; ++i; break; | ||||
| 			default: | ||||
| 				if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt); | ||||
| 				out[out.length] = {t:'t', v:c}; ++i; break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Scan for date/time parts */ | ||||
| 	var bt = 0, ss0 = 0, ssm; | ||||
| 	for(i=out.length-1, lst='t'; i >= 0; --i) { | ||||
| 		switch(out[i].t) { | ||||
| 			case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break; | ||||
| 			case 's': | ||||
| 				if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1); | ||||
| 				if(bt < 3) bt = 3; | ||||
| 			/* falls through */ | ||||
| 			case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break; | ||||
| 			case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break; | ||||
| 			case 'X': /*if(out[i].v === "B2");*/ | ||||
| 				break; | ||||
| 			case 'Z': | ||||
| 				if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1; | ||||
| 				if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2; | ||||
| 				if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3; | ||||
| 		} | ||||
| 	} | ||||
| 	/* time rounding depends on presence of minute / second / usec fields */ | ||||
| 	switch(bt) { | ||||
| 		case 0: break; | ||||
| 		case 1: | ||||
| if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } | ||||
| 			if(dt.S >=  60) { dt.S = 0; ++dt.M; } | ||||
| 			if(dt.M >=  60) { dt.M = 0; ++dt.H; } | ||||
| 			break; | ||||
| 		case 2: | ||||
| if(dt.u >= 0.5) { dt.u = 0; ++dt.S; } | ||||
| 			if(dt.S >=  60) { dt.S = 0; ++dt.M; } | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	/* replace fields */ | ||||
| 	var nstr = "", jj; | ||||
| 	for(i=0; i < out.length; ++i) { | ||||
| 		switch(out[i].t) { | ||||
| 			case 't': case 'T': case ' ': case 'D': break; | ||||
| 			case 'X': out[i].v = ""; out[i].t = ";"; break; | ||||
| 			case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z': | ||||
| out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0); | ||||
| 				out[i].t = 't'; break; | ||||
| 			case 'n': case '?': | ||||
| 				jj = i+1; | ||||
| 				while(out[jj] != null && ( | ||||
| 					(c=out[jj].t) === "?" || c === "D" || | ||||
| 					((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) || | ||||
| 					(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) || | ||||
| 					(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?')) | ||||
| 				)) { | ||||
| 					out[i].v += out[jj].v; | ||||
| 					out[jj] = {v:"", t:";"}; ++jj; | ||||
| 				} | ||||
| 				nstr += out[i].v; | ||||
| 				i = jj-1; break; | ||||
| 			case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break; | ||||
| 		} | ||||
| 	} | ||||
| 	var vv = "", myv, ostr; | ||||
| 	if(nstr.length > 0) { | ||||
| 		if(nstr.charCodeAt(0) == 40) /* '(' */ { | ||||
| 			myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v); | ||||
| 			ostr = write_num('n', nstr, myv); | ||||
| 		} else { | ||||
| 			myv = (v<0 && flen > 1 ? -v : v); | ||||
| 			ostr = write_num('n', nstr, myv); | ||||
| 			if(myv < 0 && out[0] && out[0].t == 't') { | ||||
| 				ostr = ostr.substr(1); | ||||
| 				out[0].v = "-" + out[0].v; | ||||
| 			} | ||||
| 		} | ||||
| 		jj=ostr.length-1; | ||||
| 		var decpt = out.length; | ||||
| 		for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; } | ||||
| 		var lasti=out.length; | ||||
| 		if(decpt === out.length && ostr.indexOf("E") === -1) { | ||||
| 			for(i=out.length-1; i>= 0;--i) { | ||||
| 				if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue; | ||||
| 				if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); } | ||||
| 				else if(jj < 0) out[i].v = ""; | ||||
| 				else { out[i].v = ostr.substr(0, jj+1); jj = -1; } | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 			if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v; | ||||
| 		} | ||||
| 		else if(decpt !== out.length && ostr.indexOf("E") === -1) { | ||||
| 			jj = ostr.indexOf(".")-1; | ||||
| 			for(i=decpt; i>= 0; --i) { | ||||
| 				if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue; | ||||
| 				j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1; | ||||
| 				vv = out[i].v.substr(j+1); | ||||
| 				for(; j>=0; --j) { | ||||
| 					if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv; | ||||
| 				} | ||||
| 				out[i].v = vv; | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 			if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v; | ||||
| 			jj = ostr.indexOf(".")+1; | ||||
| 			for(i=decpt; i<out.length; ++i) { | ||||
| 				if(out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue; | ||||
| 				j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0; | ||||
| 				vv = out[i].v.substr(0,j); | ||||
| 				for(; j<out[i].v.length; ++j) { | ||||
| 					if(jj<ostr.length) vv += ostr.charAt(jj++); | ||||
| 				} | ||||
| 				out[i].v = vv; | ||||
| 				out[i].t = 't'; | ||||
| 				lasti = i; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	for(i=0; i<out.length; ++i) if(out[i] != null && 'n?'.indexOf(out[i].t)>-1) { | ||||
| 		myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v); | ||||
| 		out[i].v = write_num(out[i].t, out[i].v, myv); | ||||
| 		out[i].t = 't'; | ||||
| 	} | ||||
| 	var retval = ""; | ||||
| 	for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v; | ||||
| 	return retval; | ||||
| } | ||||
| SSF._eval = eval_fmt; | ||||
| var cfregex = /\[[=<>]/; | ||||
| var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/; | ||||
| function chkcond(v, rr) { | ||||
| 	if(rr == null) return false; | ||||
| 	var thresh = parseFloat(rr[2]); | ||||
| 	switch(rr[1]) { | ||||
| 		case "=":  if(v == thresh) return true; break; | ||||
| 		case ">":  if(v >  thresh) return true; break; | ||||
| 		case "<":  if(v <  thresh) return true; break; | ||||
| 		case "<>": if(v != thresh) return true; break; | ||||
| 		case ">=": if(v >= thresh) return true; break; | ||||
| 		case "<=": if(v <= thresh) return true; break; | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| function choose_fmt(f, v) { | ||||
| 	var fmt = split_fmt(f); | ||||
| 	var l = fmt.length, lat = fmt[l-1].indexOf("@"); | ||||
| 	if(l<4 && lat>-1) --l; | ||||
| 	if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|"); | ||||
| 	if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"]; | ||||
| 	switch(fmt.length) { | ||||
| 		case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break; | ||||
| 		case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break; | ||||
| 		case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break; | ||||
| 		case 4: break; | ||||
| 	} | ||||
| 	var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2]; | ||||
| 	if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff]; | ||||
| 	if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) { | ||||
| 		var m1 = fmt[0].match(cfregex2); | ||||
| 		var m2 = fmt[1].match(cfregex2); | ||||
| 		return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]]; | ||||
| 	} | ||||
| 	return [l, ff]; | ||||
| } | ||||
| function format(fmt,v,o) { | ||||
| 	if(o == null) o = {}; | ||||
| 	var sfmt = ""; | ||||
| 	switch(typeof fmt) { | ||||
| 		case "string": | ||||
| 			if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF; | ||||
| 			else sfmt = fmt; | ||||
| 			break; | ||||
| 		case "number": | ||||
| 			if(fmt == 14 && o.dateNF) sfmt = o.dateNF; | ||||
| 			else sfmt = (o.table != null ? (o.table) : table_fmt)[fmt]; | ||||
| 			if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]]; | ||||
| 			if(sfmt == null) sfmt = default_str[fmt] || "General"; | ||||
| 			break; | ||||
| 	} | ||||
| 	if(isgeneral(sfmt,0)) return general_fmt(v, o); | ||||
| 	if(v instanceof Date) v = datenum_local(v, o.date1904); | ||||
| 	var f = choose_fmt(sfmt, v); | ||||
| 	if(isgeneral(f[1])) return general_fmt(v, o); | ||||
| 	if(v === true) v = "TRUE"; else if(v === false) v = "FALSE"; | ||||
| 	else if(v === "" || v == null) return ""; | ||||
| 	return eval_fmt(f[1], v, o, f[0]); | ||||
| } | ||||
| function load_entry(fmt, idx) { | ||||
| 	if(typeof idx != 'number') { | ||||
| 		idx = +idx || -1; | ||||
| for(var i = 0; i < 0x0188; ++i) { | ||||
| if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; } | ||||
| 			if(table_fmt[i] == fmt) { idx = i; break; } | ||||
| 		} | ||||
| if(idx < 0) idx = 0x187; | ||||
| 	} | ||||
| table_fmt[idx] = fmt; | ||||
| 	return idx; | ||||
| } | ||||
| SSF.load = load_entry; | ||||
| SSF._table = table_fmt; | ||||
| SSF.get_table = function get_table() { return table_fmt; }; | ||||
| SSF.load_table = function load_table(tbl) { | ||||
| 	for(var i=0; i!=0x0188; ++i) | ||||
| 		if(tbl[i] !== undefined) load_entry(tbl[i], i); | ||||
| }; | ||||
| SSF.init_table = init_table; | ||||
| SSF.format = format; | ||||
| }; | ||||
| make_ssf(SSF); | ||||
| /*global module */ | ||||
| if(typeof module !== 'undefined' && typeof DO_NOT_EXPORT_SSF === 'undefined') module.exports = SSF; | ||||
							
								
								
									
										1507
									
								
								packages/ssf/ssf.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1507
									
								
								packages/ssf/ssf.md
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1048576
									
								
								packages/ssf/test/cal.tsv
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1048576
									
								
								packages/ssf/test/cal.tsv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										21
									
								
								packages/ssf/test/comma.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										21
									
								
								packages/ssf/test/comma.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'); | ||||
| var data = fs.readFileSync('./test/comma.tsv','utf8').split("\n"); | ||||
| 
 | ||||
| function doit(w, headers) { | ||||
|   it(headers[w], function() { | ||||
|     for(var j=1;j<data.length;++j) { | ||||
|       if(!data[j]) continue; | ||||
|       var d = data[j].replace(/#{255}/g,"").split("\t"); | ||||
|       var expected = d[w].replace("|", ""), actual; | ||||
|       try { actual = SSF.format(headers[w], Number(d[0]), {}); } catch(e) { } | ||||
|       if(actual != expected && d[w][0] !== "|") throw new Error([actual, expected, w, headers[w],d[0],d].join("|")); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| describe('comma formats', function() { | ||||
|   var headers = data[0].split("\t"); | ||||
|   for(var w = 1; w < headers.length; ++w) doit(w, headers); | ||||
| }); | ||||
							
								
								
									
										16
									
								
								packages/ssf/test/comma.tsv
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								packages/ssf/test/comma.tsv
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| value	#.0000,,,	#.0000,,	#.0000,	#,##0.0	###,##0	###,###	#,###.00 | ||||
| 0.99	.0000	.0000	.0010	1.0	1	1	.99 | ||||
| 1.2345	.0000	.0000	.0012	1.2	1	1	1.23 | ||||
| 12.345	.0000	.0000	.0123	12.3	12	12	12.35 | ||||
| 123.456	.0000	.0001	.1235	123.5	123	123	123.46 | ||||
| 1234	.0000	.0012	1.2340	1,234.0	1,234	1,234	1,234.00 | ||||
| 12345	.0000	.0123	12.3450	12,345.0	12,345	12,345	12,345.00 | ||||
| 123456	.0001	.1235	123.4560	123,456.0	123,456	123,456	123,456.00 | ||||
| 1234567	.0012	1.2346	1234.5670	1,234,567.0	1,234,567	1,234,567	1,234,567.00 | ||||
| 12345678	.0123	12.3457	12345.6780	12,345,678.0	12,345,678	12,345,678	12,345,678.00 | ||||
| 123456789	.1235	123.4568	123456.7890	123,456,789.0	123,456,789	123,456,789	123,456,789.00 | ||||
| 1234567890	1.2346	1234.5679	1234567.8900	1,234,567,890.0	1,234,567,890	1,234,567,890	1,234,567,890.00 | ||||
| 12345678901	12.3457	12345.6789	12345678.9010	12,345,678,901.0	12,345,678,901	12,345,678,901	12,345,678,901.00 | ||||
| 123456789012	123.4568	123456.7890	123456789.0120	123,456,789,012.0	123,456,789,012	123,456,789,012	123,456,789,012.00 | ||||
| 4321	.0000	.0043	4.3210	4,321.0	4,321	4,321	4,321.00 | ||||
| 4321234	.0043	4.3212	4321.2340	4,321,234.0	4,321,234	4,321,234	4,321,234.00 | ||||
| 
 | 
							
								
								
									
										38
									
								
								packages/ssf/test/date.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										38
									
								
								packages/ssf/test/date.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint -W041 */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var dates = fs.readFileSync('./test/dates.tsv','utf8').split("\n"); | ||||
| var date2 = fs.readFileSync('./test/cal.tsv',  'utf8').split("\n"); | ||||
| var times = fs.readFileSync('./test/times.tsv','utf8').split("\n"); | ||||
| function doit(data) { | ||||
|   var step = Math.ceil(data.length/100), i = 1; | ||||
|   var headers = data[0].split("\t"); | ||||
|   for(var j = 0; j <= 100; ++j) it(String(j), function() { | ||||
|     for(var k = 0; k <= step; ++k,++i) { | ||||
|       if(data[i] == null || data[i].length < 3) return; | ||||
|       var d = data[i].replace(/#{255}/g,"").split("\t"); | ||||
|       for(var w = 1; w < headers.length; ++w) { | ||||
|         var expected = d[w], actual = SSF.format(headers[w], parseFloat(d[0]), {}); | ||||
|         if(actual != expected) throw new Error([actual, expected, w, headers[w],d[0],d,i].join("|")); | ||||
|         actual = SSF.format(headers[w].toUpperCase(), parseFloat(d[0]), {}); | ||||
|         if(actual != expected) throw new Error([actual, expected, w, headers[w].toUpperCase(),d[0],d,i].join("|")); | ||||
|       } | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| describe('time formats', function() { | ||||
|   doit(process.env.MINTEST ? times.slice(0,4000) : times); | ||||
| }); | ||||
| 
 | ||||
| describe('date formats', function() { | ||||
|   doit(process.env.MINTEST ? dates.slice(0,4000) : dates); | ||||
|   if(0) doit(process.env.MINTEST ? date2.slice(0,1000) : date2); | ||||
|   it('should fail for bad formats', function() { | ||||
|     var bad = []; | ||||
|     var chk = function(fmt){ return function(){ SSF.format(fmt,0); }; }; | ||||
|     bad.forEach(function(fmt){assert.throws(chk(fmt));}); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										22
									
								
								packages/ssf/test/date.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										22
									
								
								packages/ssf/test/date.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| [ | ||||
| 	["new Date(1900,0,1)", "1900-01-01 00:00:00", false], | ||||
| 	["new Date(1900,1,1)", "1900-02-01 00:00:00", false], | ||||
| 	["new Date(1900,2,1)", "1900-03-01 00:00:00", false], | ||||
| 	["new Date(1900,3,1)", "1900-04-01 00:00:00", false], | ||||
| 	["new Date(2000,0,1)", "2000-01-01 00:00:00", false], | ||||
| 	["new Date(2000,1,1)", "2000-02-01 00:00:00", false], | ||||
| 	["new Date(2000,2,1)", "2000-03-01 00:00:00", false], | ||||
| 	["new Date(2000,3,1)", "2000-04-01 00:00:00", false], | ||||
| 	["new Date(2000,0,1)", "2000-01-01 00:00:00", true], | ||||
| 	["new Date(2000,1,3)", "2000-02-03 00:00:00", true], | ||||
| 	["new Date(2000,2,5)", "2000-03-05 00:00:00", true], | ||||
| 	["new Date(2000,3,7)", "2000-04-07 00:00:00", true], | ||||
| 	["new Date(2100,0,1)", "2100-01-01 00:00:00", false], | ||||
| 	["new Date(2100,1,1)", "2100-02-01 00:00:00", false], | ||||
| 	["new Date(2100,2,1)", "2100-03-01 00:00:00", false], | ||||
| 	["new Date(2100,3,1)", "2100-04-01 00:00:00", false], | ||||
| 	["new Date(2100,0,1)", "2100-01-01 00:00:00", true], | ||||
| 	["new Date(2100,1,3)", "2100-02-03 00:00:00", true], | ||||
| 	["new Date(2100,2,5)", "2100-03-05 00:00:00", true], | ||||
| 	["new Date(2100,3,7)", "2100-04-07 00:00:00", true] | ||||
| ] | ||||
							
								
								
									
										50
									
								
								packages/ssf/test/dateNF.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										50
									
								
								packages/ssf/test/dateNF.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| /*eslint-env mocha, node */ | ||||
| var SSF = require('../'); | ||||
| var assert = require('assert'); | ||||
| describe('dateNF override', function() { | ||||
|   it('should override format code 14', function() { | ||||
|     assert.equal(SSF.format(14, 43880), "2/19/20"); | ||||
|     assert.equal(SSF.format(14, 43880, {dateNF:"yyyy-mm-dd"}), "2020-02-19"); | ||||
|     assert.equal(SSF.format(14, 43880, {dateNF:"dd/mm/yyyy"}), "19/02/2020"); | ||||
|   }); | ||||
|   it('should override format "m/d/yy"', function() { | ||||
|     assert.equal(SSF.format('m/d/yy', 43880), "2/19/20"); | ||||
|     assert.equal(SSF.format('m/d/yy', 43880, {dateNF:"yyyy-mm-dd"}), "2020-02-19"); | ||||
|     assert.equal(SSF.format('m/d/yy', 43880, {dateNF:"dd/mm/yyyy"}), "19/02/2020"); | ||||
|   }); | ||||
| }); | ||||
| describe('asian formats', function() { | ||||
| 	it('上午/下午 (AM/PM)', function() { | ||||
| 		assert.equal(SSF.format('上午/下午', 0),    '上午'); | ||||
| 		assert.equal(SSF.format('上午/下午', 0.25), '上午'); | ||||
| 		assert.equal(SSF.format('上午/下午', 0.49), '上午'); | ||||
| 		assert.equal(SSF.format('上午/下午', 0.5),  '下午'); | ||||
| 		assert.equal(SSF.format('上午/下午', 0.51), '下午'); | ||||
| 		assert.equal(SSF.format('上午/下午', 0.99), '下午'); | ||||
| 		assert.equal(SSF.format('上午/下午', 1),    '上午'); | ||||
| 	}); | ||||
| 	it('bb (buddhist)', function() { | ||||
| 		[ | ||||
| 			[12345, | ||||
| 				[ 'yyyy',   '1933'], | ||||
| 				[ 'eeee',   '1933'], | ||||
| 				[ 'bbbb',   '2476'], | ||||
| 				//[ 'ปปปป',   '๒๔๗๖'],
 | ||||
| 				[ 'b2yyyy', '1352'], | ||||
| 				[ 'b2eeee', '1352'], | ||||
| 				[ 'b2bbbb', '1895'], | ||||
| 				//[ 'b2ปปปป', '๑๘๙๕']
 | ||||
| 			] | ||||
| 		].forEach(function(row) { | ||||
| 			row.slice(1).forEach(function(fmt) { | ||||
| 				assert.equal(SSF.format(fmt[0], row[0]), fmt[1]); | ||||
| 			}); | ||||
| 		}); | ||||
| 	}); | ||||
| 	it.skip('thai fields', function() { | ||||
| 		SSF.format('\u0E27/\u0E14/\u0E1B\u0E1B\u0E1B\u0E1B \u0E0A\u0E0A:\u0E19\u0E19:\u0E17\u0E17', 12345.67); | ||||
| 		assert.equal(SSF.format('\u0E27/\u0E14/\u0E1B\u0E1B\u0E1B\u0E1B \u0E0A\u0E0A:\u0E19\u0E19:\u0E17\u0E17', 12345.67), "๑๘/๑๐/๒๔๗๖ ๑๖:๐๔:๔๘"); | ||||
| 	}); | ||||
| }); | ||||
							
								
								
									
										12
									
								
								packages/ssf/test/dates.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										12
									
								
								packages/ssf/test/dates.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint -W041 */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true, evil:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var data = JSON.parse(fs.readFileSync('./test/date.json','utf8')); | ||||
| 
 | ||||
| describe('date values', function() { | ||||
| 	it('should roundtrip dates', function() { data.forEach(function(d) { | ||||
| 		assert.equal(SSF.format("yyyy-mm-dd HH:MM:SS", eval(d[0]), {date1904:!!d[2]}), d[1]); | ||||
| 	}); }); | ||||
| }); | ||||
							
								
								
									
										295849
									
								
								packages/ssf/test/dates.tsv
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										295849
									
								
								packages/ssf/test/dates.tsv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										21
									
								
								packages/ssf/test/exp.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										21
									
								
								packages/ssf/test/exp.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'); | ||||
| var data = fs.readFileSync('./test/exp.tsv','utf8').split("\n"); | ||||
| function doit(d, headers) { | ||||
|   it(d[0], function() { | ||||
|     for(var w = 1; w < headers.length; ++w) { | ||||
|       var expected = d[w].replace("|", ""), actual; | ||||
|       try { actual = SSF.format(headers[w], parseFloat(d[0]), {}); } catch(e) { } | ||||
|       if(actual != expected && d[w].charAt(0) !== "|") throw new Error([actual, expected, w, headers[w],d[0],d].join("|")); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| describe('exponential formats', function() { | ||||
|   var headers = data[0].split("\t"); | ||||
|   for(var j=1;j<data.length;++j) { | ||||
|     if(!data[j]) return; | ||||
|     doit(data[j].replace(/#{255}/g,"").split("\t"), headers); | ||||
|   } | ||||
| }); | ||||
							
								
								
									
										46
									
								
								packages/ssf/test/exp.tsv
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										46
									
								
								packages/ssf/test/exp.tsv
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| value	#0.0E+0	##0.0E+0	###0.0E+0	####0.0E+0 | ||||
| 1.23457E-13	12.3E-14	123.5E-15	1234.6E-16	123.5E-15 | ||||
| 1.23457E-12	1.2E-12	1.2E-12	1.2E-12	1234.6E-15 | ||||
| 1.23457E-11	12.3E-12	12.3E-12	12.3E-12	12345.7E-15 | ||||
| 1.23457E-10	1.2E-10	123.5E-12	123.5E-12	1.2E-10 | ||||
| 1.23457E-09	12.3E-10	1.2E-9	1234.6E-12	12.3E-10 | ||||
| 1.23457E-08	1.2E-8	12.3E-9	1.2E-8	123.5E-10 | ||||
| 0.000000123457	12.3E-8	123.5E-9	12.3E-8	1234.6E-10 | ||||
| 0.00000123457	1.2E-6	1.2E-6	123.5E-8	12345.7E-10 | ||||
| 0.0000123457	12.3E-6	12.3E-6	1234.6E-8	1.2E-5 | ||||
| 0.000123457	1.2E-4	123.5E-6	1.2E-4	12.3E-5 | ||||
| 0.001234568	12.3E-4	1.2E-3	12.3E-4	123.5E-5 | ||||
| 0.012345679	1.2E-2	12.3E-3	123.5E-4	1234.6E-5 | ||||
| 0.123456789	12.3E-2	123.5E-3	1234.6E-4	12345.7E-5 | ||||
| 1.23456789	1.2E+0	1.2E+0	1.2E+0	1.2E+0 | ||||
| 12.3456789	12.3E+0	12.3E+0	12.3E+0	12.3E+0 | ||||
| 123.456789	1.2E+2	123.5E+0	123.5E+0	123.5E+0 | ||||
| 1234.56789	|12.3E+2	1.2E+3	1234.6E+0	1234.6E+0 | ||||
| 12345.6789	1.2E+4	12.3E+3	1.2E+4	12345.7E+0 | ||||
| 123456.789	12.3E+4	123.5E+3	12.3E+4	1.2E+5 | ||||
| 1234567.89	1.2E+6	1.2E+6	123.5E+4	12.3E+5 | ||||
| 12345678.9	12.3E+6	12.3E+6	|1234.6E+4	123.5E+5 | ||||
| 123456789	1.2E+8	123.5E+6	1.2E+8	1234.6E+5 | ||||
| 1234567890	12.3E+8	1.2E+9	12.3E+8	|12345.7E+5 | ||||
| 12345678900	1.2E+10	12.3E+9	123.5E+8	1.2E+10 | ||||
| 123456789000	12.3E+10	123.5E+9	1234.6E+8	12.3E+10 | ||||
| 1234567890000	1.2E+12	1.2E+12	1.2E+12	123.5E+10 | ||||
| 12345678900000	12.3E+12	12.3E+12	12.3E+12	1234.6E+10 | ||||
| 123456789000000	1.2E+14	123.5E+12	123.5E+12	12345.7E+10 | ||||
| 1234567890000000	12.3E+14	1.2E+15	1234.6E+12	1.2E+15 | ||||
| 12345678900000000	1.2E+16	12.3E+15	1.2E+16	12.3E+15 | ||||
| 123456789000000000	12.3E+16	123.5E+15	12.3E+16	123.5E+15 | ||||
| 1234567890000000000	1.2E+18	1.2E+18	123.5E+16	1234.6E+15 | ||||
| 12345678900000000000	12.3E+18	12.3E+18	1234.6E+16	12345.7E+15 | ||||
| 123456789000000000000	1.2E+20	123.5E+18	1.2E+20	1.2E+20 | ||||
| 1234567890000000000000	12.3E+20	1.2E+21	12.3E+20	12.3E+20 | ||||
| 12345678900000000000000	1.2E+22	12.3E+21	123.5E+20	123.5E+20 | ||||
| 123456789000000000000000	12.3E+22	123.5E+21	1234.6E+20	1234.6E+20 | ||||
| 1234567890000000000000000	1.2E+24	1.2E+24	1.2E+24	12345.7E+20 | ||||
| 12345678900000000000000000	12.3E+24	12.3E+24	12.3E+24	1.2E+25 | ||||
| 123456789000000000000000000	1.2E+26	123.5E+24	123.5E+24	12.3E+25 | ||||
| 1234567890000000000000000000	12.3E+26	1.2E+27	1234.6E+24	123.5E+25 | ||||
| 12345678900000000000000000000	1.2E+28	12.3E+27	1.2E+28	1234.6E+25 | ||||
| 123456789000000000000000000000	12.3E+28	123.5E+27	12.3E+28	12345.7E+25 | ||||
| 1234567890000000000000000000000	1.2E+30	1.2E+30	123.5E+28	1.2E+30 | ||||
| 12345678900000000000000000000000	12.3E+30	12.3E+30	1234.6E+28	12.3E+30 | ||||
| 
 | 
							
								
								
									
										15
									
								
								packages/ssf/test/fraction.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								packages/ssf/test/fraction.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var data = JSON.parse(fs.readFileSync('./test/fraction.json','utf8')); | ||||
| var skip = []; | ||||
| describe('fractional formats', function() { | ||||
|   data.forEach(function(d) { | ||||
|     it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ | ||||
|       var expected = d[2], actual = SSF.format(d[1], d[0], {}); | ||||
|       //var r = actual.match(/(-?)\d* *\d+\/\d+/);
 | ||||
|       assert.equal(actual, expected); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										121
									
								
								packages/ssf/test/fraction.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										121
									
								
								packages/ssf/test/fraction.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,121 @@ | ||||
| [ | ||||
|   [1,            "# ?/?",      "1    "], | ||||
|   [-1.2,         "# ?/?",     "-1 1/5"], | ||||
|   [12.3,         "# ?/?",     "12 1/3"], | ||||
|   [-12.34,       "# ?/?",    "-12 1/3"], | ||||
|   [123.45,       "# ?/?",    "123 4/9"], | ||||
|   [-123.456,     "# ?/?",   "-123 1/2"], | ||||
|   [1234.567,     "# ?/?",   "1234 4/7"], | ||||
|   [-1234.5678,   "# ?/?",  "-1234 4/7"], | ||||
|   [12345.6789,   "# ?/?",  "12345 2/3"], | ||||
|   [-12345.67891, "# ?/?", "-12345 2/3"], | ||||
| 
 | ||||
|   [1,            "# ??/??",      "1      "], | ||||
|   [-1.2,         "# ??/??",     "-1  1/5 "], | ||||
|   [12.3,         "# ??/??",     "12  3/10"], | ||||
|   [-12.34,       "# ??/??",    "-12 17/50"], | ||||
|   [123.45,       "# ??/??",    "123  9/20"], | ||||
|   [-123.456,     "# ??/??",   "-123 26/57"], | ||||
|   [1234.567,     "# ??/??",   "1234 55/97"], | ||||
|   [-1234.5678,   "# ??/??",  "-1234 46/81"], | ||||
|   [12345.6789,   "# ??/??",  "12345 55/81"], | ||||
|   [-12345.67891, "# ??/??", "-12345 55/81"], | ||||
| 
 | ||||
|   [1,            "# ???/???",      "1        "], | ||||
|   [-1.2,         "# ???/???",     "-1   1/5  "], | ||||
|   [12.3,         "# ???/???",     "12   3/10 "], | ||||
|   [-12.34,       "# ???/???",    "-12  17/50 "], | ||||
|   [123.45,       "# ???/???",    "123   9/20 "], | ||||
|   [-123.456,     "# ???/???",   "-123  57/125"], | ||||
|   [1234.567,     "# ???/???",   "1234  55/97 "], | ||||
|   [-1234.5678,   "# ???/???",  "-1234  67/118"], | ||||
|   [12345.6789,   "# ???/???",  "12345  74/109"], | ||||
|   [-12345.67891, "# ???/???", "-12345 573/844"], | ||||
| 
 | ||||
| 
 | ||||
|   [1,            "# ?/2",      "1    "], | ||||
|   [-1.2,         "# ?/2",     "-1    "], | ||||
|   [12.3,         "# ?/2",     "12 1/2"], | ||||
|   [-12.34,       "# ?/2",    "-12 1/2"], | ||||
|   [123.45,       "# ?/2",    "123 1/2"], | ||||
|   [-123.456,     "# ?/2",   "-123 1/2"], | ||||
|   [1234.567,     "# ?/2",   "1234 1/2"], | ||||
|   [-1234.5678,   "# ?/2",  "-1234 1/2"], | ||||
|   [12345.6789,   "# ?/2",  "12345 1/2"], | ||||
|   [-12345.67891, "# ?/2", "-12345 1/2"],  | ||||
| 
 | ||||
|   [1,            "# ?/4",      "1    "], | ||||
|   [-1.2,         "# ?/4",     "-1 1/4"], | ||||
|   [12.3,         "# ?/4",     "12 1/4"], | ||||
|   [-12.34,       "# ?/4",    "-12 1/4"], | ||||
|   [123.45,       "# ?/4",    "123 2/4"], | ||||
|   [-123.456,     "# ?/4",   "-123 2/4"], | ||||
|   [1234.567,     "# ?/4",   "1234 2/4"], | ||||
|   [-1234.5678,   "# ?/4",  "-1234 2/4"], | ||||
|   [12345.6789,   "# ?/4",  "12345 3/4"], | ||||
|   [-12345.67891, "# ?/4", "-12345 3/4"], | ||||
| 
 | ||||
|   [1,            "# ?/8",      "1    "], | ||||
|   [-1.2,         "# ?/8",     "-1 2/8"], | ||||
|   [12.3,         "# ?/8",     "12 2/8"], | ||||
|   [-12.34,       "# ?/8",    "-12 3/8"], | ||||
|   [123.45,       "# ?/8",    "123 4/8"], | ||||
|   [-123.456,     "# ?/8",   "-123 4/8"], | ||||
|   [1234.567,     "# ?/8",   "1234 5/8"], | ||||
|   [-1234.5678,   "# ?/8",  "-1234 5/8"], | ||||
|   [12345.6789,   "# ?/8",  "12345 5/8"], | ||||
|   [-12345.67891, "# ?/8", "-12345 5/8"], | ||||
| 
 | ||||
|   [1,            "# ??/16",      "1      "], | ||||
|   [-1.2,         "# ??/16",     "-1  3/16"], | ||||
|   [12.3,         "# ??/16",     "12  5/16"], | ||||
|   [-12.34,       "# ??/16",    "-12  5/16"], | ||||
|   [123.45,       "# ??/16",    "123  7/16"], | ||||
|   [-123.456,     "# ??/16",   "-123  7/16"], | ||||
|   [1234.567,     "# ??/16",   "1234  9/16"], | ||||
|   [-1234.5678,   "# ??/16",  "-1234  9/16"], | ||||
|   [12345.6789,   "# ??/16",  "12345 11/16"], | ||||
|   [-12345.67891, "# ??/16", "-12345 11/16"], | ||||
| 
 | ||||
|   [1,            "# ?/10",      "1     "], | ||||
|   [-1.2,         "# ?/10",     "-1 2/10"], | ||||
|   [12.3,         "# ?/10",     "12 3/10"], | ||||
|   [-12.34,       "# ?/10",    "-12 3/10"], | ||||
|   [123.45,       "# ?/10",    "123 5/10"], | ||||
|   [-123.456,     "# ?/10",   "-123 5/10"], | ||||
|   [1234.567,     "# ?/10",   "1234 6/10"], | ||||
|   [-1234.5678,   "# ?/10",  "-1234 6/10"], | ||||
|   [12345.6789,   "# ?/10",  "12345 7/10"], | ||||
|   [-12345.67891, "# ?/10", "-12345 7/10"], | ||||
| 
 | ||||
|   [1,            "# ??/100",      "1       "], | ||||
|   [-1.2,         "# ??/100",     "-1 20/100"], | ||||
|   [12.3,         "# ??/100",     "12 30/100"], | ||||
|   [-12.34,       "# ??/100",    "-12 34/100"], | ||||
|   [123.45,       "# ??/100",    "123 45/100"], | ||||
|   [-123.456,     "# ??/100",   "-123 46/100"], | ||||
|   [1234.567,     "# ??/100",   "1234 57/100"], | ||||
|   [-1234.5678,   "# ??/100",  "-1234 57/100"], | ||||
|   [12345.6789,   "# ??/100",  "12345 68/100"], | ||||
|   [-12345.67891, "# ??/100", "-12345 68/100"], | ||||
| 
 | ||||
|   [1,            "??/??",            " 1/1 "], | ||||
|   [-1.2,         "??/??",           "- 6/5 "], | ||||
|   [12.3,         "??/??",           "123/10"], | ||||
|   [-12.34,       "??/??",          "-617/50"], | ||||
|   [123.45,       "??/??",          "2469/20"], | ||||
|   [-123.456,     "??/??",         "-7037/57"], | ||||
|   [1234.567,     "??/??",        "119753/97"], | ||||
|   [-1234.5678,   "??/??",       "-100000/81"], | ||||
|   [12345.6789,   "??/??",       "1000000/81"], | ||||
|   [-12345.67891, "??/??",      "-1000000/81"], | ||||
| 
 | ||||
|   [0.3,          "# ?/?",      " 2/7"], | ||||
|   [1.3,          "# ?/?",      "1 1/3"], | ||||
|   [2.3,          "# ?/?",      "2 2/7"], | ||||
| 
 | ||||
|   [0.123251512342345, "# ??/?????????", "  480894/3901729"], | ||||
|   [0.123251512342345, "# ?? / ?????????", "  480894 / 3901729"], | ||||
| 
 | ||||
|   [0, "0", "0"] | ||||
| ] | ||||
							
								
								
									
										26
									
								
								packages/ssf/test/general.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								packages/ssf/test/general.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var data = JSON.parse(fs.readFileSync('./test/general.json','utf8')); | ||||
| var skip = []; | ||||
| describe('General format', function() { | ||||
|   data.forEach(function(d) { | ||||
|     it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ | ||||
|       assert.equal(SSF.format(d[1], d[0], {}), d[2]); | ||||
|     }); | ||||
|   }); | ||||
|   it('should handle special values', function() { | ||||
|     assert.equal(SSF.format("General", true), "TRUE"); | ||||
|     assert.equal(SSF.format("General", undefined), ""); | ||||
|     assert.equal(SSF.format("General", null), ""); | ||||
|   }); | ||||
|   it('should handle dates', function() { | ||||
|     assert.equal(SSF.format("General", new Date(2017, 1, 19)), "2/19/17"); | ||||
|     assert.equal(SSF.format("General", new Date(2017, 1, 19), {date1904:true}), "2/19/17"); | ||||
|     assert.equal(SSF.format("General", new Date(1901, 0, 1)), "1/1/01"); | ||||
|     if(SSF.format("General", new Date(1901, 0, 1), {date1904:true}) == "1/1/01") throw new Error("date1904 invalid date"); | ||||
|     assert.equal(SSF.format("General", new Date(1904, 0, 1)), "1/1/04"); | ||||
|     assert.equal(SSF.format("General", new Date(1904, 0, 1), {date1904:true}), "1/1/04"); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										516
									
								
								packages/ssf/test/general.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										516
									
								
								packages/ssf/test/general.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,516 @@ | ||||
| [ | ||||
|   [1.234567E-14, 0, "1.23457E-14"], | ||||
|   [1.234567E-13, 0, "1.23457E-13"], | ||||
|   [1.234567E-12, 0, "1.23457E-12"], | ||||
|   [1.234567E-11, 0, "1.23457E-11"], | ||||
|   [1.234567E-10, 0, "1.23457E-10"], | ||||
|   [1.234567E-9, 0, "1.23457E-09"], | ||||
|   [1.234567E-8, 0, "1.23457E-08"], | ||||
|   [1.234567E-7, 0, "1.23457E-07"], | ||||
|   [1.234567E-6, 0, "1.23457E-06"], | ||||
|   [1.234567E-5, 0, "1.23457E-05"], | ||||
|   [1.234567E-4, 0, "0.000123457"], | ||||
|   [1.234567E-3, 0, "0.001234567"], | ||||
|   [1.234567E-2, 0, "0.01234567"], | ||||
|   [1.234567E-1, 0, "0.1234567"], | ||||
|   [1.234567E0, 0, "1.234567"], | ||||
|   [1.234567E1, 0, "12.34567"], | ||||
|   [1.234567E2, 0, "123.4567"], | ||||
|   [1.234567E3, 0, "1234.567"], | ||||
|   [1.234567E4, 0, "12345.67"], | ||||
|   [1.234567E5, 0, "123456.7"], | ||||
|   [1.234567E6, 0, "1234567"], | ||||
|   [1.234567E7, 0, "12345670"], | ||||
|   [1.234567E8, 0, "123456700"], | ||||
|   [1.234567E9, 0, "1234567000"], | ||||
|   [1.234567E10, 0, "12345670000"], | ||||
|   [1.234567E11, 0, "1.23457E+11"], | ||||
|   [1.234567E12, 0, "1.23457E+12"], | ||||
|   [1.234567E13, 0, "1.23457E+13"], | ||||
|   [1.234567E14, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.00000000000001, 0, "1E-14"], | ||||
|   [0.0000000000001, 0, "1E-13"], | ||||
|   [0.000000000001, 0, "1E-12"], | ||||
|   [0.00000000001, 0, "1E-11"], | ||||
|   [0.0000000001, 0, "1E-10"], | ||||
|   [0.000000001, 0, "0.000000001"], | ||||
|   [0.00000001, 0, "0.00000001"], | ||||
|   [0.0000001, 0, "0.0000001"], | ||||
|   [0.000001, 0, "0.000001"], | ||||
|   [0.00001, 0, "0.00001"], | ||||
|   [0.0001, 0, "0.0001"], | ||||
|   [0.001, 0, "0.001"], | ||||
|   [0.01, 0, "0.01"], | ||||
|   [0.1, 0, "0.1"], | ||||
|   [1, 0, "1"], | ||||
|   [10, 0, "10"], | ||||
|   [100, 0, "100"], | ||||
|   [1000, 0, "1000"], | ||||
|   [10000, 0, "10000"], | ||||
|   [100000, 0, "100000"], | ||||
|   [1000000, 0, "1000000"], | ||||
|   [10000000, 0, "10000000"], | ||||
|   [100000000, 0, "100000000"], | ||||
|   [1000000000, 0, "1000000000"], | ||||
|   [10000000000, 0, "10000000000"], | ||||
|   [100000000000, 0, "1E+11"], | ||||
|   [1000000000000, 0, "1E+12"], | ||||
|   [10000000000000, 0, "1E+13"], | ||||
|   [100000000000000, 0, "1E+14"], | ||||
| 
 | ||||
|   [0.000000000000012, 0, "1.2E-14"], | ||||
|   [0.00000000000012, 0, "1.2E-13"], | ||||
|   [0.0000000000012, 0, "1.2E-12"], | ||||
|   [0.000000000012, 0, "1.2E-11"], | ||||
|   [0.00000000012, 0, "1.2E-10"], | ||||
|   [0.0000000012, 0, "1.2E-09"], | ||||
|   [0.000000012, 0, "0.000000012"], | ||||
|   [0.00000012, 0, "0.00000012"], | ||||
|   [0.0000012, 0, "0.0000012"], | ||||
|   [0.000012, 0, "0.000012"], | ||||
|   [0.00012, 0, "0.00012"], | ||||
|   [0.0012, 0, "0.0012"], | ||||
|   [0.012, 0, "0.012"], | ||||
|   [0.12, 0, "0.12"], | ||||
|   [1.2, 0, "1.2"], | ||||
|   [12, 0, "12"], | ||||
|   [120, 0, "120"], | ||||
|   [1200, 0, "1200"], | ||||
|   [12000, 0, "12000"], | ||||
|   [120000, 0, "120000"], | ||||
|   [1200000, 0, "1200000"], | ||||
|   [12000000, 0, "12000000"], | ||||
|   [120000000, 0, "120000000"], | ||||
|   [1200000000, 0, "1200000000"], | ||||
|   [12000000000, 0, "12000000000"], | ||||
|   [120000000000, 0, "1.2E+11"], | ||||
|   [1200000000000, 0, "1.2E+12"], | ||||
|   [12000000000000, 0, "1.2E+13"], | ||||
|   [120000000000000, 0, "1.2E+14"], | ||||
| 
 | ||||
|   [0.0000000000000123, 0, "1.23E-14"], | ||||
|   [0.000000000000123, 0, "1.23E-13"], | ||||
|   [0.00000000000123, 0, "1.23E-12"], | ||||
|   [0.0000000000123, 0, "1.23E-11"], | ||||
|   [0.000000000123, 0, "1.23E-10"], | ||||
|   [0.00000000123, 0, "1.23E-09"], | ||||
|   [0.0000000123, 0, "1.23E-08"], | ||||
|   [0.000000123, 0, "0.000000123"], | ||||
|   [0.00000123, 0, "0.00000123"], | ||||
|   [0.0000123, 0, "0.0000123"], | ||||
|   [0.000123, 0, "0.000123"], | ||||
|   [0.00123, 0, "0.00123"], | ||||
|   [0.0123, 0, "0.0123"], | ||||
|   [0.123, 0, "0.123"], | ||||
|   [1.23, 0, "1.23"], | ||||
|   [12.3, 0, "12.3"], | ||||
|   [123, 0, "123"], | ||||
|   [1230, 0, "1230"], | ||||
|   [12300, 0, "12300"], | ||||
|   [123000, 0, "123000"], | ||||
|   [1230000, 0, "1230000"], | ||||
|   [12300000, 0, "12300000"], | ||||
|   [123000000, 0, "123000000"], | ||||
|   [1230000000, 0, "1230000000"], | ||||
|   [12300000000, 0, "12300000000"], | ||||
|   [123000000000, 0, "1.23E+11"], | ||||
|   [1230000000000, 0, "1.23E+12"], | ||||
|   [12300000000000, 0, "1.23E+13"], | ||||
|   [123000000000000, 0, "1.23E+14"], | ||||
| 
 | ||||
|   [0.00000000000001234, 0, "1.234E-14"], | ||||
|   [0.0000000000001234, 0, "1.234E-13"], | ||||
|   [0.000000000001234, 0, "1.234E-12"], | ||||
|   [0.00000000001234, 0, "1.234E-11"], | ||||
|   [0.0000000001234, 0, "1.234E-10"], | ||||
|   [0.000000001234, 0, "1.234E-09"], | ||||
|   [0.00000001234, 0, "1.234E-08"], | ||||
|   [0.0000001234, 0, "1.234E-07"], | ||||
|   [0.000001234, 0, "0.000001234"], | ||||
|   [0.00001234, 0, "0.00001234"], | ||||
|   [0.0001234, 0, "0.0001234"], | ||||
|   [0.001234, 0, "0.001234"], | ||||
|   [0.01234, 0, "0.01234"], | ||||
|   [0.1234, 0, "0.1234"], | ||||
|   [1.234, 0, "1.234"], | ||||
|   [12.34, 0, "12.34"], | ||||
|   [123.4, 0, "123.4"], | ||||
|   [1234, 0, "1234"], | ||||
|   [12340, 0, "12340"], | ||||
|   [123400, 0, "123400"], | ||||
|   [1234000, 0, "1234000"], | ||||
|   [12340000, 0, "12340000"], | ||||
|   [123400000, 0, "123400000"], | ||||
|   [1234000000, 0, "1234000000"], | ||||
|   [12340000000, 0, "12340000000"], | ||||
|   [123400000000, 0, "1.234E+11"], | ||||
|   [1234000000000, 0, "1.234E+12"], | ||||
|   [12340000000000, 0, "1.234E+13"], | ||||
|   [123400000000000, 0, "1.234E+14"], | ||||
| 
 | ||||
|   [0.000000000000012345, 0, "1.2345E-14"], | ||||
|   [0.00000000000012345, 0, "1.2345E-13"], | ||||
|   [0.0000000000012345, 0, "1.2345E-12"], | ||||
|   [0.000000000012345, 0, "1.2345E-11"], | ||||
|   [0.00000000012345, 0, "1.2345E-10"], | ||||
|   [0.0000000012345, 0, "1.2345E-09"], | ||||
|   [0.000000012345, 0, "1.2345E-08"], | ||||
|   [0.00000012345, 0, "1.2345E-07"], | ||||
|   [0.0000012345, 0, "1.2345E-06"], | ||||
|   [0.000012345, 0, "0.000012345"], | ||||
|   [0.00012345, 0, "0.00012345"], | ||||
|   [0.0012345, 0, "0.0012345"], | ||||
|   [0.012345, 0, "0.012345"], | ||||
|   [0.12345, 0, "0.12345"], | ||||
|   [1.2345, 0, "1.2345"], | ||||
|   [12.345, 0, "12.345"], | ||||
|   [123.45, 0, "123.45"], | ||||
|   [1234.5, 0, "1234.5"], | ||||
|   [12345, 0, "12345"], | ||||
|   [123450, 0, "123450"], | ||||
|   [1234500, 0, "1234500"], | ||||
|   [12345000, 0, "12345000"], | ||||
|   [123450000, 0, "123450000"], | ||||
|   [1234500000, 0, "1234500000"], | ||||
|   [12345000000, 0, "12345000000"], | ||||
|   [123450000000, 0, "1.2345E+11"], | ||||
|   [1234500000000, 0, "1.2345E+12"], | ||||
|   [12345000000000, 0, "1.2345E+13"], | ||||
|   [123450000000000, 0, "1.2345E+14"], | ||||
| 
 | ||||
|   [0.0000000000000123456, 0, "1.23456E-14"], | ||||
|   [0.000000000000123456, 0, "1.23456E-13"], | ||||
|   [0.00000000000123456, 0, "1.23456E-12"], | ||||
|   [0.0000000000123456, 0, "1.23456E-11"], | ||||
|   [0.000000000123456, 0, "1.23456E-10"], | ||||
|   [0.00000000123456, 0, "1.23456E-09"], | ||||
|   [0.0000000123456, 0, "1.23456E-08"], | ||||
|   [0.000000123456, 0, "1.23456E-07"], | ||||
|   [0.00000123456, 0, "1.23456E-06"], | ||||
|   [0.0000123456, 0, "1.23456E-05"], | ||||
|   [0.000123456, 0, "0.000123456"], | ||||
|   [0.00123456, 0, "0.00123456"], | ||||
|   [0.0123456, 0, "0.0123456"], | ||||
|   [0.123456, 0, "0.123456"], | ||||
|   [1.23456, 0, "1.23456"], | ||||
|   [12.3456, 0, "12.3456"], | ||||
|   [123.456, 0, "123.456"], | ||||
|   [1234.56, 0, "1234.56"], | ||||
|   [12345.6, 0, "12345.6"], | ||||
|   [123456, 0, "123456"], | ||||
|   [1234560, 0, "1234560"], | ||||
|   [12345600, 0, "12345600"], | ||||
|   [123456000, 0, "123456000"], | ||||
|   [1234560000, 0, "1234560000"], | ||||
|   [12345600000, 0, "12345600000"], | ||||
|   [123456000000, 0, "1.23456E+11"], | ||||
|   [1234560000000, 0, "1.23456E+12"], | ||||
|   [12345600000000, 0, "1.23456E+13"], | ||||
|   [123456000000000, 0, "1.23456E+14"], | ||||
| 
 | ||||
|   [0.00000000000001234567, 0, "1.23457E-14"], | ||||
|   [0.0000000000001234567, 0, "1.23457E-13"], | ||||
|   [0.000000000001234567, 0, "1.23457E-12"], | ||||
|   [0.00000000001234567, 0, "1.23457E-11"], | ||||
|   [0.0000000001234567, 0, "1.23457E-10"], | ||||
|   [0.000000001234567, 0, "1.23457E-09"], | ||||
|   [0.00000001234567, 0, "1.23457E-08"], | ||||
|   [0.0000001234567, 0, "1.23457E-07"], | ||||
|   [0.000001234567, 0, "1.23457E-06"], | ||||
|   [0.00001234567, 0, "1.23457E-05"], | ||||
|   [0.0001234567, 0, "0.000123457"], | ||||
|   [0.001234567, 0, "0.001234567"], | ||||
|   [0.01234567, 0, "0.01234567"], | ||||
|   [0.1234567, 0, "0.1234567"], | ||||
|   [1.234567, 0, "1.234567"], | ||||
|   [12.34567, 0, "12.34567"], | ||||
|   [123.4567, 0, "123.4567"], | ||||
|   [1234.567, 0, "1234.567"], | ||||
|   [12345.67, 0, "12345.67"], | ||||
|   [123456.7, 0, "123456.7"], | ||||
|   [1234567, 0, "1234567"], | ||||
|   [12345670, 0, "12345670"], | ||||
|   [123456700, 0, "123456700"], | ||||
|   [1234567000, 0, "1234567000"], | ||||
|   [12345670000, 0, "12345670000"], | ||||
|   [123456700000, 0, "1.23457E+11"], | ||||
|   [1234567000000, 0, "1.23457E+12"], | ||||
|   [12345670000000, 0, "1.23457E+13"], | ||||
|   [123456700000000, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.000000000000012345678, 0, "1.23457E-14"], | ||||
|   [0.00000000000012345678, 0, "1.23457E-13"], | ||||
|   [0.0000000000012345678, 0, "1.23457E-12"], | ||||
|   [0.000000000012345678, 0, "1.23457E-11"], | ||||
|   [0.00000000012345678, 0, "1.23457E-10"], | ||||
|   [0.0000000012345678, 0, "1.23457E-09"], | ||||
|   [0.000000012345678, 0, "1.23457E-08"], | ||||
|   [0.00000012345678, 0, "1.23457E-07"], | ||||
|   [0.0000012345678, 0, "1.23457E-06"], | ||||
|   [0.000012345678, 0, "1.23457E-05"], | ||||
|   [0.00012345678, 0, "0.000123457"], | ||||
|   [0.0012345678, 0, "0.001234568"], | ||||
|   [0.012345678, 0, "0.012345678"], | ||||
|   [0.12345678, 0, "0.12345678"], | ||||
|   [1.2345678, 0, "1.2345678"], | ||||
|   [12.345678, 0, "12.345678"], | ||||
|   [123.45678, 0, "123.45678"], | ||||
|   [1234.5678, 0, "1234.5678"], | ||||
|   [12345.678, 0, "12345.678"], | ||||
|   [123456.78, 0, "123456.78"], | ||||
|   [1234567.8, 0, "1234567.8"], | ||||
|   [12345678, 0, "12345678"], | ||||
|   [123456780, 0, "123456780"], | ||||
|   [1234567800, 0, "1234567800"], | ||||
|   [12345678000, 0, "12345678000"], | ||||
|   [123456780000, 0, "1.23457E+11"], | ||||
|   [1234567800000, 0, "1.23457E+12"], | ||||
|   [12345678000000, 0, "1.23457E+13"], | ||||
|   [123456780000000, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.0000000000000123456789, 0, "1.23457E-14"], | ||||
|   [0.000000000000123456789, 0, "1.23457E-13"], | ||||
|   [0.00000000000123456789, 0, "1.23457E-12"], | ||||
|   [0.0000000000123456789, 0, "1.23457E-11"], | ||||
|   [0.000000000123456789, 0, "1.23457E-10"], | ||||
|   [0.00000000123456789, 0, "1.23457E-09"], | ||||
|   [0.0000000123456789, 0, "1.23457E-08"], | ||||
|   [0.000000123456789, 0, "1.23457E-07"], | ||||
|   [0.00000123456789, 0, "1.23457E-06"], | ||||
|   [0.0000123456789, 0, "1.23457E-05"], | ||||
|   [0.000123456789, 0, "0.000123457"], | ||||
|   [0.00123456789, 0, "0.001234568"], | ||||
|   [0.0123456789, 0, "0.012345679"], | ||||
|   [0.123456789, 0, "0.123456789"], | ||||
|   [1.23456789, 0, "1.23456789"], | ||||
|   [12.3456789, 0, "12.3456789"], | ||||
|   [123.456789, 0, "123.456789"], | ||||
|   [1234.56789, 0, "1234.56789"], | ||||
|   [12345.6789, 0, "12345.6789"], | ||||
|   [123456.789, 0, "123456.789"], | ||||
|   [1234567.89, 0, "1234567.89"], | ||||
|   [12345678.9, 0, "12345678.9"], | ||||
|   [123456789, 0, "123456789"], | ||||
|   [1234567890, 0, "1234567890"], | ||||
|   [12345678900, 0, "12345678900"], | ||||
|   [123456789000, 0, "1.23457E+11"], | ||||
|   [1234567890000, 0, "1.23457E+12"], | ||||
|   [12345678900000, 0, "1.23457E+13"], | ||||
|   [123456789000000, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.00000000000001234567891, 0, "1.23457E-14"], | ||||
|   [0.0000000000001234567891, 0, "1.23457E-13"], | ||||
|   [0.000000000001234567891, 0, "1.23457E-12"], | ||||
|   [0.00000000001234567891, 0, "1.23457E-11"], | ||||
|   [0.0000000001234567891, 0, "1.23457E-10"], | ||||
|   [0.000000001234567891, 0, "1.23457E-09"], | ||||
|   [0.00000001234567891, 0, "1.23457E-08"], | ||||
|   [0.0000001234567891, 0, "1.23457E-07"], | ||||
|   [0.000001234567891, 0, "1.23457E-06"], | ||||
|   [0.00001234567891, 0, "1.23457E-05"], | ||||
|   [0.0001234567891, 0, "0.000123457"], | ||||
|   [0.001234567891, 0, "0.001234568"], | ||||
|   [0.01234567891, 0, "0.012345679"], | ||||
|   [0.1234567891, 0, "0.123456789"], | ||||
|   [1.234567891, 0, "1.234567891"], | ||||
|   [12.34567891, 0, "12.34567891"], | ||||
|   [123.4567891, 0, "123.4567891"], | ||||
|   [1234.567891, 0, "1234.567891"], | ||||
|   [12345.67891, 0, "12345.67891"], | ||||
|   [123456.7891, 0, "123456.7891"], | ||||
|   [1234567.891, 0, "1234567.891"], | ||||
|   [12345678.91, 0, "12345678.91"], | ||||
|   [123456789.1, 0, "123456789.1"], | ||||
|   [1234567891, 0, "1234567891"], | ||||
|   [12345678910, 0, "12345678910"], | ||||
|   [123456789100, 0, "1.23457E+11"], | ||||
|   [1234567891000, 0, "1.23457E+12"], | ||||
|   [12345678910000, 0, "1.23457E+13"], | ||||
|   [123456789100000, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.000000000000012345678912, 0, "1.23457E-14"], | ||||
|   [0.00000000000012345678912, 0, "1.23457E-13"], | ||||
|   [0.0000000000012345678912, 0, "1.23457E-12"], | ||||
|   [0.000000000012345678912, 0, "1.23457E-11"], | ||||
|   [0.00000000012345678912, 0, "1.23457E-10"], | ||||
|   [0.0000000012345678912, 0, "1.23457E-09"], | ||||
|   [0.000000012345678912, 0, "1.23457E-08"], | ||||
|   [0.00000012345678912, 0, "1.23457E-07"], | ||||
|   [0.0000012345678912, 0, "1.23457E-06"], | ||||
|   [0.000012345678912, 0, "1.23457E-05"], | ||||
|   [0.00012345678912, 0, "0.000123457"], | ||||
|   [0.0012345678912, 0, "0.001234568"], | ||||
|   [0.012345678912, 0, "0.012345679"], | ||||
|   [0.12345678912, 0, "0.123456789"], | ||||
|   [1.2345678912, 0, "1.234567891"], | ||||
|   [12.345678912, 0, "12.34567891"], | ||||
|   [123.45678912, 0, "123.4567891"], | ||||
|   [1234.5678912, 0, "1234.567891"], | ||||
|   [12345.678912, 0, "12345.67891"], | ||||
|   [123456.78912, 0, "123456.7891"], | ||||
|   [1234567.8912, 0, "1234567.891"], | ||||
|   [12345678.912, 0, "12345678.91"], | ||||
|   [123456789.12, 0, "123456789.1"], | ||||
|   [1234567891.2, 0, "1234567891"], | ||||
|   [12345678912, 0, "12345678912"], | ||||
|   [123456789120, 0, "1.23457E+11"], | ||||
|   [1234567891200, 0, "1.23457E+12"], | ||||
|   [12345678912000, 0, "1.23457E+13"], | ||||
|   [123456789120000, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.0000000000000123456789123, 0, "1.23457E-14"], | ||||
|   [0.000000000000123456789123, 0, "1.23457E-13"], | ||||
|   [0.00000000000123456789123, 0, "1.23457E-12"], | ||||
|   [0.0000000000123456789123, 0, "1.23457E-11"], | ||||
|   [0.000000000123456789123, 0, "1.23457E-10"], | ||||
|   [0.00000000123456789123, 0, "1.23457E-09"], | ||||
|   [0.0000000123456789123, 0, "1.23457E-08"], | ||||
|   [0.000000123456789123, 0, "1.23457E-07"], | ||||
|   [0.00000123456789123, 0, "1.23457E-06"], | ||||
|   [0.0000123456789123, 0, "1.23457E-05"], | ||||
|   [0.000123456789123, 0, "0.000123457"], | ||||
|   [0.00123456789123, 0, "0.001234568"], | ||||
|   [0.0123456789123, 0, "0.012345679"], | ||||
|   [0.123456789123, 0, "0.123456789"], | ||||
|   [1.23456789123, 0, "1.234567891"], | ||||
|   [12.3456789123, 0, "12.34567891"], | ||||
|   [123.456789123, 0, "123.4567891"], | ||||
|   [1234.56789123, 0, "1234.567891"], | ||||
|   [12345.6789123, 0, "12345.67891"], | ||||
|   [123456.789123, 0, "123456.7891"], | ||||
|   [1234567.89123, 0, "1234567.891"], | ||||
|   [12345678.9123, 0, "12345678.91"], | ||||
|   [123456789.123, 0, "123456789.1"], | ||||
|   [1234567891.23, 0, "1234567891"], | ||||
|   [12345678912.3, 0, "12345678912"], | ||||
|   [123456789123, 0, "1.23457E+11"], | ||||
|   [1234567891230, 0, "1.23457E+12"], | ||||
|   [12345678912300, 0, "1.23457E+13"], | ||||
|   [123456789123000, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.00000000000001234567891234, 0, "1.23457E-14"], | ||||
|   [0.0000000000001234567891234, 0, "1.23457E-13"], | ||||
|   [0.000000000001234567891234, 0, "1.23457E-12"], | ||||
|   [0.00000000001234567891234, 0, "1.23457E-11"], | ||||
|   [0.0000000001234567891234, 0, "1.23457E-10"], | ||||
|   [0.000000001234567891234, 0, "1.23457E-09"], | ||||
|   [0.00000001234567891234, 0, "1.23457E-08"], | ||||
|   [0.0000001234567891234, 0, "1.23457E-07"], | ||||
|   [0.000001234567891234, 0, "1.23457E-06"], | ||||
|   [0.00001234567891234, 0, "1.23457E-05"], | ||||
|   [0.0001234567891234, 0, "0.000123457"], | ||||
|   [0.001234567891234, 0, "0.001234568"], | ||||
|   [0.01234567891234, 0, "0.012345679"], | ||||
|   [0.1234567891234, 0, "0.123456789"], | ||||
|   [1.234567891234, 0, "1.234567891"], | ||||
|   [12.34567891234, 0, "12.34567891"], | ||||
|   [123.4567891234, 0, "123.4567891"], | ||||
|   [1234.567891234, 0, "1234.567891"], | ||||
|   [12345.67891234, 0, "12345.67891"], | ||||
|   [123456.7891234, 0, "123456.7891"], | ||||
|   [1234567.891234, 0, "1234567.891"], | ||||
|   [12345678.91234, 0, "12345678.91"], | ||||
|   [123456789.1234, 0, "123456789.1"], | ||||
|   [1234567891.234, 0, "1234567891"], | ||||
|   [12345678912.34, 0, "12345678912"], | ||||
|   [123456789123.4, 0, "1.23457E+11"], | ||||
|   [1234567891234, 0, "1.23457E+12"], | ||||
|   [12345678912340, 0, "1.23457E+13"], | ||||
|   [123456789123400, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.000000000000012345678912345, 0, "1.23457E-14"], | ||||
|   [0.00000000000012345678912345, 0, "1.23457E-13"], | ||||
|   [0.0000000000012345678912345, 0, "1.23457E-12"], | ||||
|   [0.000000000012345678912345, 0, "1.23457E-11"], | ||||
|   [0.00000000012345678912345, 0, "1.23457E-10"], | ||||
|   [0.0000000012345678912345, 0, "1.23457E-09"], | ||||
|   [0.000000012345678912345, 0, "1.23457E-08"], | ||||
|   [0.00000012345678912345, 0, "1.23457E-07"], | ||||
|   [0.0000012345678912345, 0, "1.23457E-06"], | ||||
|   [0.000012345678912345, 0, "1.23457E-05"], | ||||
|   [0.00012345678912345, 0, "0.000123457"], | ||||
|   [0.0012345678912345, 0, "0.001234568"], | ||||
|   [0.012345678912345, 0, "0.012345679"], | ||||
|   [0.12345678912345, 0, "0.123456789"], | ||||
|   [1.2345678912345, 0, "1.234567891"], | ||||
|   [12.345678912345, 0, "12.34567891"], | ||||
|   [123.45678912345, 0, "123.4567891"], | ||||
|   [1234.5678912345, 0, "1234.567891"], | ||||
|   [12345.678912345, 0, "12345.67891"], | ||||
|   [123456.78912345, 0, "123456.7891"], | ||||
|   [1234567.8912345, 0, "1234567.891"], | ||||
|   [12345678.912345, 0, "12345678.91"], | ||||
|   [123456789.12345, 0, "123456789.1"], | ||||
|   [1234567891.2345, 0, "1234567891"], | ||||
|   [12345678912.345, 0, "12345678912"], | ||||
|   [123456789123.45, 0, "1.23457E+11"], | ||||
|   [1234567891234.5, 0, "1.23457E+12"], | ||||
|   [12345678912345, 0, "1.23457E+13"], | ||||
|   [123456789123450, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [0.0000000000000123456789123456, 0, "1.23457E-14"], | ||||
|   [0.000000000000123456789123456, 0, "1.23457E-13"], | ||||
|   [0.00000000000123456789123456, 0, "1.23457E-12"], | ||||
|   [0.0000000000123456789123456, 0, "1.23457E-11"], | ||||
|   [0.000000000123456789123456, 0, "1.23457E-10"], | ||||
|   [0.00000000123456789123456, 0, "1.23457E-09"], | ||||
|   [0.0000000123456789123456, 0, "1.23457E-08"], | ||||
|   [0.000000123456789123456, 0, "1.23457E-07"], | ||||
|   [0.00000123456789123456, 0, "1.23457E-06"], | ||||
|   [0.0000123456789123456, 0, "1.23457E-05"], | ||||
|   [0.000123456789123456, 0, "0.000123457"], | ||||
|   [0.00123456789123456, 0, "0.001234568"], | ||||
|   [0.0123456789123456, 0, "0.012345679"], | ||||
|   [0.123456789123456, 0, "0.123456789"], | ||||
|   [1.23456789123456, 0, "1.234567891"], | ||||
|   [12.3456789123456, 0, "12.34567891"], | ||||
|   [123.456789123456, 0, "123.4567891"], | ||||
|   [1234.56789123456, 0, "1234.567891"], | ||||
|   [12345.6789123456, 0, "12345.67891"], | ||||
|   [123456.789123456, 0, "123456.7891"], | ||||
|   [1234567.89123456, 0, "1234567.891"], | ||||
|   [12345678.9123456, 0, "12345678.91"], | ||||
|   [123456789.123456, 0, "123456789.1"], | ||||
|   [1234567891.23456, 0, "1234567891"], | ||||
|   [12345678912.3456, 0, "12345678912"], | ||||
|   [123456789123.456, 0, "1.23457E+11"], | ||||
|   [1234567891234.56, 0, "1.23457E+12"], | ||||
|   [12345678912345.6, 0, "1.23457E+13"], | ||||
|   [123456789123456, 0, "1.23457E+14"], | ||||
| 
 | ||||
|   [-0.00000000000001234567, 0, "-1.23457E-14"], | ||||
|   [-0.0000000000001234567, 0, "-1.23457E-13"], | ||||
|   [-0.000000000001234567, 0, "-1.23457E-12"], | ||||
|   [-0.00000000001234567, 0, "-1.23457E-11"], | ||||
|   [-0.0000000001234567, 0, "-1.23457E-10"], | ||||
|   [-0.000000001234567, 0, "-1.23457E-09"], | ||||
|   [-0.00000001234567, 0, "-1.23457E-08"], | ||||
|   [-0.0000001234567, 0, "-1.23457E-07"], | ||||
|   [-0.000001234567, 0, "-1.23457E-06"], | ||||
|   [-0.00001234567, 0, "-1.23457E-05"], | ||||
|   [-0.0001234567, 0, "-0.000123457"], | ||||
|   [-0.001234567, 0, "-0.001234567"], | ||||
|   [-0.01234567, 0, "-0.01234567"], | ||||
|   [-0.1234567, 0, "-0.1234567"], | ||||
|   [-1.234567, 0, "-1.234567"], | ||||
|   [-12.34567, 0, "-12.34567"], | ||||
|   [-123.4567, 0, "-123.4567"], | ||||
|   [-1234.567, 0, "-1234.567"], | ||||
|   [-12345.67, 0, "-12345.67"], | ||||
|   [-123456.7, 0, "-123456.7"], | ||||
|   [-1234567, 0, "-1234567"], | ||||
|   [-12345670, 0, "-12345670"], | ||||
|   [-123456700, 0, "-123456700"], | ||||
|   [-1234567000, 0, "-1234567000"], | ||||
|   [-12345670000, 0, "-12345670000"], | ||||
|   [-123456700000, 0, "-1.23457E+11"], | ||||
|   [-1234567000000, 0, "-1.23457E+12"], | ||||
|   [-12345670000000, 0, "-1.23457E+13"], | ||||
|   [-123456700000000, 0, "-1.23457E+14"], | ||||
| 
 | ||||
|   [true, 0, "TRUE"], | ||||
|   [false, 0, "FALSE"], | ||||
|    | ||||
|   ["sheetjs", 0, "sheetjs"] | ||||
| ] | ||||
							
								
								
									
										17
									
								
								packages/ssf/test/implied.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										17
									
								
								packages/ssf/test/implied.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var data = JSON.parse(fs.readFileSync('./test/implied.json','utf8')); | ||||
| var skip = []; | ||||
| function doit(d) { | ||||
|   d[1].forEach(function(r){if(r.length === 2)assert.equal(SSF.format(r[0],d[0]),r[1]);}); | ||||
| } | ||||
| describe('implied formats', function() { | ||||
|   data.forEach(function(d) { | ||||
|     if(d.length == 2) it(String(d[0]), function() { doit(d); }); | ||||
|     else it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ | ||||
|       assert.equal(SSF.format(d[1], d[0], {}), d[2]); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										756
									
								
								packages/ssf/test/implied.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										756
									
								
								packages/ssf/test/implied.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,756 @@ | ||||
| [ | ||||
|   [1234567890000, [ | ||||
|     [0, "1.23457E+12"], | ||||
|     [1, "1234567890000"], | ||||
|     [2, "1234567890000.00"], | ||||
|     [3, "1,234,567,890,000"], | ||||
|     [4, "1,234,567,890,000.00"], | ||||
|     [9, "123456789000000%"], | ||||
|     [10, "123456789000000.00%"], | ||||
|     [11, "1.23E+12"], | ||||
|     [12, "1234567890000    "], | ||||
|     [13, "1234567890000      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "1,234,567,890,000 "], | ||||
|     [38, "1,234,567,890,000 "], | ||||
|     [39, "1,234,567,890,000.00"], | ||||
|     [40, "1,234,567,890,000.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "1.2E+12"], | ||||
|     [49, "1.23457E+12"] | ||||
|   ]], | ||||
| 
 | ||||
|   [123456789000, [ | ||||
|     [0, "1.23457E+11"], | ||||
|     [1, "123456789000"], | ||||
|     [2, "123456789000.00"], | ||||
|     [3, "123,456,789,000"], | ||||
|     [4, "123,456,789,000.00"], | ||||
|     [9, "12345678900000%"], | ||||
|     [10, "12345678900000.00%"], | ||||
|     [11, "1.23E+11"], | ||||
|     [12, "123456789000    "], | ||||
|     [13, "123456789000      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "123,456,789,000 "], | ||||
|     [38, "123,456,789,000 "], | ||||
|     [39, "123,456,789,000.00"], | ||||
|     [40, "123,456,789,000.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "123.5E+9"], | ||||
|     [49, "1.23457E+11"] | ||||
|   ]], | ||||
| 
 | ||||
|   [12345678900, [ | ||||
|     [0, "12345678900"], | ||||
|     [1, "12345678900"], | ||||
|     [2, "12345678900.00"], | ||||
|     [3, "12,345,678,900"], | ||||
|     [4, "12,345,678,900.00"], | ||||
|     [9, "1234567890000%"], | ||||
|     [10, "1234567890000.00%"], | ||||
|     [11, "1.23E+10"], | ||||
|     [12, "12345678900    "], | ||||
|     [13, "12345678900      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "12,345,678,900 "], | ||||
|     [38, "12,345,678,900 "], | ||||
|     [39, "12,345,678,900.00"], | ||||
|     [40, "12,345,678,900.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "12.3E+9"], | ||||
|     [49, "12345678900"] | ||||
|   ]], | ||||
| 
 | ||||
|   [1234567890, [ | ||||
|     [0, "1234567890"], | ||||
|     [1, "1234567890"], | ||||
|     [2, "1234567890.00"], | ||||
|     [3, "1,234,567,890"], | ||||
|     [4, "1,234,567,890.00"], | ||||
|     [9, "123456789000%"], | ||||
|     [10, "123456789000.00%"], | ||||
|     [11, "1.23E+09"], | ||||
|     [12, "1234567890    "], | ||||
|     [13, "1234567890      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "1,234,567,890 "], | ||||
|     [38, "1,234,567,890 "], | ||||
|     [39, "1,234,567,890.00"], | ||||
|     [40, "1,234,567,890.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "1.2E+9"], | ||||
|     [49, "1234567890"] | ||||
|   ]], | ||||
| 
 | ||||
|   [123456789, [ | ||||
|     [0, "123456789"], | ||||
|     [1, "123456789"], | ||||
|     [2, "123456789.00"], | ||||
|     [3, "123,456,789"], | ||||
|     [4, "123,456,789.00"], | ||||
|     [9, "12345678900%"], | ||||
|     [10, "12345678900.00%"], | ||||
|     [11, "1.23E+08"], | ||||
|     [12, "123456789    "], | ||||
|     [13, "123456789      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "123,456,789 "], | ||||
|     [38, "123,456,789 "], | ||||
|     [39, "123,456,789.00"], | ||||
|     [40, "123,456,789.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "123.5E+6"], | ||||
|     [49, "123456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [12345678.9, [ | ||||
|     [0, "12345678.9"], | ||||
|     [1, "12345679"], | ||||
|     [2, "12345678.90"], | ||||
|     [3, "12,345,679"], | ||||
|     [4, "12,345,678.90"], | ||||
|     [9, "1234567890%"], | ||||
|     [10, "1234567890.00%"], | ||||
|     [11, "1.23E+07"], | ||||
|     [12, "12345679    "], | ||||
|     [13, "12345678  9/10"], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "12,345,679 "], | ||||
|     [38, "12,345,679 "], | ||||
|     [39, "12,345,678.90"], | ||||
|     [40, "12,345,678.90"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "12.3E+6"], | ||||
|     [49, "12345678.9"] | ||||
|   ]], | ||||
| 
 | ||||
|   [1234567.89, [ | ||||
|     [0, "1234567.89"], | ||||
|     [1, "1234568"], | ||||
|     [2, "1234567.89"], | ||||
|     [3, "1,234,568"], | ||||
|     [4, "1,234,567.89"], | ||||
|     [9, "123456789%"], | ||||
|     [10, "123456789.00%"], | ||||
|     [11, "1.23E+06"], | ||||
|     [12, "1234567 8/9"], | ||||
|     [13, "1234567  8/9 "], | ||||
|     [14, "2/15/80"], | ||||
|     [15, "15-Feb-80"], | ||||
|     [16, "15-Feb"], | ||||
|     [17, "Feb-80"], | ||||
|     [18, "9:21 PM"], | ||||
|     [19, "9:21:36 PM"], | ||||
|     [20, "21:21"], | ||||
|     [21, "21:21:36"], | ||||
|     [22, "2/15/80 21:21"], | ||||
|     [37, "1,234,568 "], | ||||
|     [38, "1,234,568 "], | ||||
|     [39, "1,234,567.89"], | ||||
|     [40, "1,234,567.89"], | ||||
|     [45, "21:36"], | ||||
|     [46, "29629629:21:36"], | ||||
|     [47, "2136.0"], | ||||
|     [48, "1.2E+6"], | ||||
|     [49, "1234567.89"] | ||||
|   ]], | ||||
| 
 | ||||
|   [123456.789, [ | ||||
|     [0, "123456.789"], | ||||
|     [1, "123457"], | ||||
|     [2, "123456.79"], | ||||
|     [3, "123,457"], | ||||
|     [4, "123,456.79"], | ||||
|     [9, "12345679%"], | ||||
|     [10, "12345678.90%"], | ||||
|     [11, "1.23E+05"], | ||||
|     [12, "123456 4/5"], | ||||
|     [13, "123456 15/19"], | ||||
|     [14, "1/3/38"], | ||||
|     [15, "3-Jan-38"], | ||||
|     [16, "3-Jan"], | ||||
|     [17, "Jan-38"], | ||||
|     [18, "6:56 PM"], | ||||
|     [19, "6:56:10 PM"], | ||||
|     [20, "18:56"], | ||||
|     [21, "18:56:10"], | ||||
|     [22, "1/3/38 18:56"], | ||||
|     [37, "123,457 "], | ||||
|     [38, "123,457 "], | ||||
|     [39, "123,456.79"], | ||||
|     [40, "123,456.79"], | ||||
|     [45, "56:10"], | ||||
|     [46, "2962962:56:10"], | ||||
|     [47, "5609.6"], | ||||
|     [48, "123.5E+3"], | ||||
|     [49, "123456.789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [12345.6789, [ | ||||
|     [0, "12345.6789"], | ||||
|     [1, "12346"], | ||||
|     [2, "12345.68"], | ||||
|     [3, "12,346"], | ||||
|     [4, "12,345.68"], | ||||
|     [9, "1234568%"], | ||||
|     [10, "1234567.89%"], | ||||
|     [11, "1.23E+04"], | ||||
|     [12, "12345 2/3"], | ||||
|     [13, "12345 55/81"], | ||||
|     [14, "10/18/33"], | ||||
|     [15, "18-Oct-33"], | ||||
|     [16, "18-Oct"], | ||||
|     [17, "Oct-33"], | ||||
|     [18, "4:17 PM"], | ||||
|     [19, "4:17:37 PM"], | ||||
|     [20, "16:17"], | ||||
|     [21, "16:17:37"], | ||||
|     [22, "10/18/33 16:17"], | ||||
|     [37, "12,346 "], | ||||
|     [38, "12,346 "], | ||||
|     [39, "12,345.68"], | ||||
|     [40, "12,345.68"], | ||||
|     [45, "17:37"], | ||||
|     [46, "296296:17:37"], | ||||
|     [47, "1737.0"], | ||||
|     [48, "12.3E+3"], | ||||
|     [49, "12345.6789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [1234.56789, [ | ||||
|     [0, "1234.56789"], | ||||
|     [1, "1235"], | ||||
|     [2, "1234.57"], | ||||
|     [3, "1,235"], | ||||
|     [4, "1,234.57"], | ||||
|     [9, "123457%"], | ||||
|     [10, "123456.79%"], | ||||
|     [11, "1.23E+03"], | ||||
|     [12, "1234 4/7"], | ||||
|     [13, "1234 46/81"], | ||||
|     [14, "5/18/03"], | ||||
|     [15, "18-May-03"], | ||||
|     [16, "18-May"], | ||||
|     [17, "May-03"], | ||||
|     [18, "1:37 PM"], | ||||
|     [19, "1:37:46 PM"], | ||||
|     [20, "13:37"], | ||||
|     [21, "13:37:46"], | ||||
|     [22, "5/18/03 13:37"], | ||||
|     [37, "1,235 "], | ||||
|     [38, "1,235 "], | ||||
|     [39, "1,234.57"], | ||||
|     [40, "1,234.57"], | ||||
|     [45, "37:46"], | ||||
|     [46, "29629:37:46"], | ||||
|     [47, "3745.7"], | ||||
|     [48, "1.2E+3"], | ||||
|     [49, "1234.56789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [123.456789, [ | ||||
|     [0, "123.456789"], | ||||
|     [1, "123"], | ||||
|     [2, "123.46"], | ||||
|     [3, "123"], | ||||
|     [4, "123.46"], | ||||
|     [9, "12346%"], | ||||
|     [10, "12345.68%"], | ||||
|     [11, "1.23E+02"], | ||||
|     [12, "123 1/2"], | ||||
|     [13, "123 37/81"], | ||||
|     [14, "5/2/00"], | ||||
|     [15, "2-May-00"], | ||||
|     [16, "2-May"], | ||||
|     [17, "May-00"], | ||||
|     [18, "10:57 AM"], | ||||
|     [19, "10:57:47 AM"], | ||||
|     [20, "10:57"], | ||||
|     [21, "10:57:47"], | ||||
|     [22, "5/2/00 10:57"], | ||||
|     [37, "123 "], | ||||
|     [38, "123 "], | ||||
|     [39, "123.46"], | ||||
|     [40, "123.46"], | ||||
|     [45, "57:47"], | ||||
|     [46, "2962:57:47"], | ||||
|     [47, "5746.6"], | ||||
|     [48, "123.5E+0"], | ||||
|     [49, "123.456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [12.3456789, [ | ||||
|     [0, "12.3456789"], | ||||
|     [1, "12"], | ||||
|     [2, "12.35"], | ||||
|     [3, "12"], | ||||
|     [4, "12.35"], | ||||
|     [9, "1235%"], | ||||
|     [10, "1234.57%"], | ||||
|     [11, "1.23E+01"], | ||||
|     [12, "12 1/3"], | ||||
|     [13, "12 28/81"], | ||||
|     [14, "1/12/00"], | ||||
|     [15, "12-Jan-00"], | ||||
|     [16, "12-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "8:17 AM"], | ||||
|     [19, "8:17:47 AM"], | ||||
|     [20, "8:17"], | ||||
|     [21, "8:17:47"], | ||||
|     [22, "1/12/00 8:17"], | ||||
|     [37, "12 "], | ||||
|     [38, "12 "], | ||||
|     [39, "12.35"], | ||||
|     [40, "12.35"], | ||||
|     [45, "17:47"], | ||||
|     [46, "296:17:47"], | ||||
|     [47, "1746.7"], | ||||
|     [48, "12.3E+0"], | ||||
|     [49, "12.3456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [1.23456789, [ | ||||
|     [0, "1.23456789"], | ||||
|     [1, "1"], | ||||
|     [2, "1.23"], | ||||
|     [3, "1"], | ||||
|     [4, "1.23"], | ||||
|     [9, "123%"], | ||||
|     [10, "123.46%"], | ||||
|     [11, "1.23E+00"], | ||||
|     [12, "1 1/4"], | ||||
|     [13, "1 19/81"], | ||||
|     [14, "1/1/00"], | ||||
|     [15, "1-Jan-00"], | ||||
|     [16, "1-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "5:37 AM"], | ||||
|     [19, "5:37:47 AM"], | ||||
|     [20, "5:37"], | ||||
|     [21, "5:37:47"], | ||||
|     [22, "1/1/00 5:37"], | ||||
|     [37, "1 "], | ||||
|     [38, "1 "], | ||||
|     [39, "1.23"], | ||||
|     [40, "1.23"], | ||||
|     [45, "37:47"], | ||||
|     [46, "29:37:47"], | ||||
|     [47, "3746.7"], | ||||
|     [48, "1.2E+0"], | ||||
|     [49, "1.23456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.123456789, [ | ||||
|     [0, "0.123456789"], | ||||
|     [1, "0"], | ||||
|     [2, "0.12"], | ||||
|     [3, "0"], | ||||
|     [4, "0.12"], | ||||
|     [9, "12%"], | ||||
|     [10, "12.35%"], | ||||
|     [11, "1.23E-01"], | ||||
|     [12, " 1/8"], | ||||
|     [13, " 10/81"], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "2:57 AM"], | ||||
|     [19, "2:57:47 AM"], | ||||
|     [20, "2:57"], | ||||
|     [21, "2:57:47"], | ||||
|     [22, "1/0/00 2:57"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.12"], | ||||
|     [40, "0.12"], | ||||
|     [45, "57:47"], | ||||
|     [46, "2:57:47"], | ||||
|     [47, "5746.7"], | ||||
|     [48, "123.5E-3"], | ||||
|     [49, "0.123456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.0123456789, [ | ||||
|     [0, "0.012345679"], | ||||
|     [1, "0"], | ||||
|     [2, "0.01"], | ||||
|     [3, "0"], | ||||
|     [4, "0.01"], | ||||
|     [9, "1%"], | ||||
|     [10, "1.23%"], | ||||
|     [11, "1.23E-02"], | ||||
|     [12, "0    "], | ||||
|     [13, "  1/81"], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:17 AM"], | ||||
|     [19, "12:17:47 AM"], | ||||
|     [20, "0:17"], | ||||
|     [21, "0:17:47"], | ||||
|     [22, "1/0/00 0:17"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.01"], | ||||
|     [40, "0.01"], | ||||
|     [45, "17:47"], | ||||
|     [46, "0:17:47"], | ||||
|     [47, "1746.7"], | ||||
|     [48, "12.3E-3"], | ||||
|     [49, "0.012345679"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.00123456789, [ | ||||
|     [0, "0.001234568"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.12%"], | ||||
|     [11, "1.23E-03"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:01 AM"], | ||||
|     [19, "12:01:47 AM"], | ||||
|     [20, "0:01"], | ||||
|     [21, "0:01:47"], | ||||
|     [22, "1/0/00 0:01"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "01:47"], | ||||
|     [46, "0:01:47"], | ||||
|     [47, "0146.7"], | ||||
|     [48, "1.2E-3"], | ||||
|     [49, "0.001234568"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.000123456789, [ | ||||
|     [0, "0.000123457"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.01%"], | ||||
|     [11, "1.23E-04"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:11 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:11"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:11"], | ||||
|     [46, "0:00:11"], | ||||
|     [47, "0010.7"], | ||||
|     [48, "123.5E-6"], | ||||
|     [49, "0.000123457"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.0000123456789, [ | ||||
|     [0, "1.23457E-05"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-05"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:01 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:01"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:01"], | ||||
|     [46, "0:00:01"], | ||||
|     [47, "0001.1"], | ||||
|     [48, "12.3E-6"], | ||||
|     [49, "1.23457E-05"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.00000123456789, [ | ||||
|     [0, "1.23457E-06"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-06"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.1"], | ||||
|     [48, "1.2E-6"], | ||||
|     [49, "1.23457E-06"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.000000123456789, [ | ||||
|     [0, "1.23457E-07"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-07"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.0"], | ||||
|     [48, "123.5E-9"], | ||||
|     [49, "1.23457E-07"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.0000000123456789, [ | ||||
|     [0, "1.23457E-08"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-08"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.0"], | ||||
|     [48, "12.3E-9"], | ||||
|     [49, "1.23457E-08"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.00000000123456789, [ | ||||
|     [0, "1.23457E-09"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-09"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.0"], | ||||
|     [48, "1.2E-9"], | ||||
|     [49, "1.23457E-09"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.000000000123456789, [ | ||||
|     [0, "1.23457E-10"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-10"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.0"], | ||||
|     [48, "123.5E-12"], | ||||
|     [49, "1.23457E-10"] | ||||
|   ]], | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   [-12345.6789, [ | ||||
|     [0, "-12345.6789"], | ||||
|     [1, "-12346"], | ||||
|     [2, "-12345.68"], | ||||
|     [3, "-12,346"], | ||||
|     [4, "-12,345.68"], | ||||
|     [9, "-1234568%"], | ||||
|     [10, "-1234567.89%"], | ||||
|     [11, "-1.23E+04"], | ||||
|     [12, "-12345 2/3"], | ||||
|     [13, "-12345 55/81"], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "(12,346)"], | ||||
|     [38, "(12,346)"], | ||||
|     [39, "(12,345.68)"], | ||||
|     [40, "(12,345.68)"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "-12.3E+3"], | ||||
|     [49, "-12345.6789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [11.666666666666666, 0, "11.66666667"], | ||||
|   [5.057996968497839, 0, "5.057996968"], | ||||
|   [4.380353866983808, 0, "4.380353867"], | ||||
|   [12.333333333333343, 0, "12.33333333"], | ||||
|   [-0.000006211546860868111, 0, "-6.21155E-06"], | ||||
|   [12345.67876, 47, "1724.9"], | ||||
|   [0, 0, "0"] | ||||
| ] | ||||
							
								
								
									
										40
									
								
								packages/ssf/test/implied.njs
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										40
									
								
								packages/ssf/test/implied.njs
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,40 @@ | ||||
| #!/usr/bin/env node | ||||
| var ssf = require("../"); | ||||
| var val = 12345.6789; | ||||
| console.log(val); | ||||
| [ | ||||
| 	"0", // 1 | ||||
| 	"0.00", // 2 | ||||
| 	"#,##0", // 3 | ||||
| 	"#,##0.00", // 4 | ||||
| 	"0%", // 9 | ||||
| 	"0.00%", // 10 | ||||
| 	"0.00E+00", // 11 | ||||
| 	"# ?/?", // 12 | ||||
| 	"# ??/??", // 13 | ||||
| 	"m/d/yy", // 14 | ||||
| 	"d-mmm-yy", // 15 | ||||
| 	"d-mmm", // 16 | ||||
| 	"mmm-yy", // 17 | ||||
| 	"h:mm AM/PM", // 18 | ||||
| 	"h:mm:ss AM/PM", // 19  | ||||
| 	"h:mm", // 20 | ||||
| 	"h:mm:ss", // 21 | ||||
| 	"m/d/yy h:mm", // 22 | ||||
| 	"#,##0 ;(#,##0)", // 37 | ||||
| 	"#,##0 ;[Red](#,##0)", // 38 | ||||
| 	"#,##0.00;(#,##0.00)", // 39 | ||||
| 	"#,##0.00;[Red](#,##0.00)", // 40 | ||||
| 	"mm:ss", // 45 | ||||
| 	"[h]:mm:ss", // 46 | ||||
| 	"mmss.0", // 47 | ||||
| 	"##0.0E+0", // 48 | ||||
| 	"@", // 49 | ||||
| 
 | ||||
| 	"General" // 0 | ||||
| ].forEach(function(x) { | ||||
| 	try { | ||||
| 		console.log(x + "|" + ssf.format(x,val,{})); | ||||
| 	} catch (e) { } | ||||
| 	 | ||||
| }); | ||||
							
								
								
									
										447
									
								
								packages/ssf/test/is_date.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										447
									
								
								packages/ssf/test/is_date.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,447 @@ | ||||
| [ | ||||
| 	["General", false], | ||||
| 	["yyyy", true], | ||||
| 	["\" Excellent\"", false], | ||||
| 	["\" Fair\"", false], | ||||
| 	["\" Good\"", false], | ||||
| 	["\" Poor\"", false], | ||||
| 	["\" Very Good\"", false], | ||||
| 	["\"$\"#,##0", false], | ||||
| 	["\"$\"#,##0.00", false], | ||||
| 	["\"$\"#,##0.00_);[Red]\\(\"$\"#,##0.00\\)", false], | ||||
| 	["\"$\"#,##0.00_);\\(\"$\"#,##0.00\\)", false], | ||||
| 	["\"$\"#,##0;[Red]\\-\"$\"#,##0", false], | ||||
| 	["\"$\"#,##0_);[Red]\\(\"$\"#,##0\\)", false], | ||||
| 	["\"$\"#,##0_);\\(\"$\"#,##0\\)", false], | ||||
| 	["\"Haha!\"\\ @\\ \"Yeah!\"", false], | ||||
| 	["\"TRUE\";\"TRUE\";\"FALSE\"", false], | ||||
| 	["\"True\";\"True\";\"False\";@", false], | ||||
| 	["\"Years: \"0", false], | ||||
| 	["\"Yes\";\"Yes\";\"No\";@", false], | ||||
| 	["\"kl \"hh:mm:ss;@", true], | ||||
| 	["\"£\"#,##0.00", false], | ||||
| 	["\"£\"#,##0;[Red]\\-\"£\"#,##0", false], | ||||
| 	["\"€\"#,##0.00", false], | ||||
| 	["\"€\"\\ #,##0.00_-", false], | ||||
| 	["\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"", true], | ||||
| 	["\"¥\"#,##0.00;\"¥\"\\-#,##0.00", false], | ||||
| 	["#", false], | ||||
| 	["# ?/?", false], | ||||
| 	["# ??/??", false], | ||||
| 	["#\" \"?/?", false], | ||||
| 	["#\" \"??/??", false], | ||||
| 	["#\"abded\"\\ ??/??", false], | ||||
| 	["###0.00;-###0.00", false], | ||||
| 	["###0;-###0", false], | ||||
| 	["##0.0E+0", false], | ||||
| 	["#,##0", false], | ||||
| 	["#,##0 ;(#,##0)", false], | ||||
| 	["#,##0 ;[Red](#,##0)", false], | ||||
| 	["#,##0\"р.\";[Red]\\-#,##0\"р.\"", false], | ||||
| 	["#,##0.0", false], | ||||
| 	["#,##0.00", false], | ||||
| 	["#,##0.00 \"<22>\"", false], | ||||
| 	["#,##0.00 €;-#,##0.00 €", false], | ||||
| 	["#,##0.00\"р.\";[Red]\\-#,##0.00\"р.\"", false], | ||||
| 	["#,##0.000", false], | ||||
| 	["#,##0.0000", false], | ||||
| 	["#,##0.00000", false], | ||||
| 	["#,##0.000000", false], | ||||
| 	["#,##0.0000000", false], | ||||
| 	["#,##0.00000000", false], | ||||
| 	["#,##0.000000000", false], | ||||
| 	["#,##0.00000000;[Red]#,##0.00000000", false], | ||||
| 	["#,##0.0000_ ", false], | ||||
| 	["#,##0.000_ ", false], | ||||
| 	["#,##0.000_);\\(#,##0.000\\)", false], | ||||
| 	["#,##0.00;(#,##0.00)", false], | ||||
| 	["#,##0.00;(#,##0.00);0.00", false], | ||||
| 	["#,##0.00;[Red](#,##0.00)", false], | ||||
| 	["#,##0.00;[Red]\\(#,##0.00\\)", false], | ||||
| 	["#,##0.00;\\(#,##0.00\\)", false], | ||||
| 	["#,##0.00[$₹-449]_);\\(#,##0.00[$₹-449]\\)", false], | ||||
| 	["#,##0.00\\ \"р.\"", false], | ||||
| 	["#,##0.00\\ \"р.\";[Red]\\-#,##0.00\\ \"р.\"", false], | ||||
| 	["#,##0.00\\ [$€-407]", false], | ||||
| 	["#,##0.00\\ [$€-40C]", false], | ||||
| 	["#,##0.00_);\\(#,##0.00\\)", false], | ||||
| 	["#,##0.00_р_.;[Red]\\-#,##0.00_р_.", false], | ||||
| 	["#,##0.00_р_.;\\-#,##0.00_р_.", false], | ||||
| 	["#,##0.0;[Red]#,##0.0", false], | ||||
| 	["#,##0.0_ ;\\-#,##0.0\\ ", false], | ||||
| 	["#,##0.0_);[Red]\\(#,##0.0\\)", false], | ||||
| 	["#,##0.0_);\\(#,##0.0\\)", false], | ||||
| 	["#,##0;\\-#,##0;0", false], | ||||
| 	["#,##0\\ \"р.\";[Red]\\-#,##0\\ \"р.\"", false], | ||||
| 	["#,##0\\ \"р.\";\\-#,##0\\ \"р.\"", false], | ||||
| 	["#,##0\\ ;[Red]\\(#,##0\\)", false], | ||||
| 	["#,##0\\ ;\\(#,##0\\)", false], | ||||
| 	["#,##0_ ", false], | ||||
| 	["#,##0_ ;[Red]\\-#,##0\\ ", false], | ||||
| 	["#,##0_);[Red]\\(#,##0\\)", false], | ||||
| 	["#,##0_р_.;[Red]\\-#,##0_р_.", false], | ||||
| 	["#,##0_р_.;\\-#,##0_р_.", false], | ||||
| 	["#.0000,,", false], | ||||
| 	["#0", false], | ||||
| 	["#0.00", false], | ||||
| 	["#0.0000", false], | ||||
| 	["#\\ ?/10", false], | ||||
| 	["#\\ ?/2", false], | ||||
| 	["#\\ ?/4", false], | ||||
| 	["#\\ ?/8", false], | ||||
| 	["#\\ ?/?", false], | ||||
| 	["#\\ ??/100", false], | ||||
| 	["#\\ ??/100;[Red]\\(#\\ ??/16\\)", false], | ||||
| 	["#\\ ??/16", false], | ||||
| 	["#\\ ??/??", false], | ||||
| 	["#\\ ??/?????????", false], | ||||
| 	["#\\ ???/???", false], | ||||
| 	["**\\ #,###,#00,000.00,**", false], | ||||
| 	["0", false], | ||||
| 	["0\"abde\".0\"??\"000E+00", false], | ||||
| 	["0%", false], | ||||
| 	["0.0", false], | ||||
| 	["0.0%", false], | ||||
| 	["0.00", false], | ||||
| 	["0.00\"°\"", false], | ||||
| 	["0.00%", false], | ||||
| 	["0.000", false], | ||||
| 	["0.000%", false], | ||||
| 	["0.0000", false], | ||||
| 	["0.000000", false], | ||||
| 	["0.00000000", false], | ||||
| 	["0.000000000", false], | ||||
| 	["0.000000000%", false], | ||||
| 	["0.00000000000", false], | ||||
| 	["0.000000000000000", false], | ||||
| 	["0.00000000E+00", false], | ||||
| 	["0.0000E+00", false], | ||||
| 	["0.00;[Red]0.00", false], | ||||
| 	["0.00E+00", false], | ||||
| 	["0.00_);[Red]\\(0.00\\)", false], | ||||
| 	["0.00_);\\(0.00\\)", false], | ||||
| 	["0.0_ ", false], | ||||
| 	["00.00.00.000", false], | ||||
| 	["00.000%", false], | ||||
| 	["0000", false], | ||||
| 	["00000", false], | ||||
| 	["00000000", false], | ||||
| 	["000000000", false], | ||||
| 	["00000\\-0000", false], | ||||
| 	["00000\\-00000", false], | ||||
| 	["000\\-00\\-0000", false], | ||||
| 	["0;[Red]0", false], | ||||
| 	["0\\-00000\\-00000\\-0", false], | ||||
| 	["0_);[Red]\\(0\\)", false], | ||||
| 	["0_);\\(0\\)", false], | ||||
| 	["@", false], | ||||
| 	["A/P", true], | ||||
| 	["AM/PM", true], | ||||
| 	["AM/PMh\"時\"mm\"分\"ss\"秒\";@", true], | ||||
| 	["D", true], | ||||
| 	["DD", true], | ||||
| 	["DD/MM/YY;@", true], | ||||
| 	["DD/MM/YYYY", true], | ||||
| 	["DD/MM/YYYY;@", true], | ||||
| 	["DDD", true], | ||||
| 	["DDDD", true], | ||||
| 	["DDDD\", \"MMMM\\ DD\", \"YYYY", true], | ||||
| 	["GENERAL", false], | ||||
| 	["General", false], | ||||
| 	["H", true], | ||||
| 	["H:MM:SS\\ AM/PM", true], | ||||
| 	["HH:MM", true], | ||||
| 	["HH:MM:SS\\ AM/PM", true], | ||||
| 	["HHM", true], | ||||
| 	["HHMM", true], | ||||
| 	["HH[MM]", true], | ||||
| 	["HH[M]", true], | ||||
| 	["M/D/YYYY", true], | ||||
| 	["M/D/YYYY\\ H:MM", true], | ||||
| 	["MM/DD/YY", true], | ||||
| 	["S", true], | ||||
| 	["SS", true], | ||||
| 	["YY", true], | ||||
| 	["YYM", true], | ||||
| 	["YYMM", true], | ||||
| 	["YYMMM", true], | ||||
| 	["YYMMMM", true], | ||||
| 	["YYMMMMM", true], | ||||
| 	["YYYY", true], | ||||
| 	["YYYY-MM-DD HH:MM:SS", true], | ||||
| 	["YYYY\\-MM\\-DD", true], | ||||
| 	["[$$-409]#,##0", false], | ||||
| 	["[$$-409]#,##0.00", false], | ||||
| 	["[$$-409]#,##0.00_);[Red]\\([$$-409]#,##0.00\\)", false], | ||||
| 	["[$$-C09]#,##0.00", false], | ||||
| 	["[$-100042A]h:mm:ss\\ AM/PM;@", true], | ||||
| 	["[$-1010409]0.000%", false], | ||||
| 	["[$-1010409]General", false], | ||||
| 	["[$-1010409]d/m/yyyy\\ h:mm\\ AM/PM;@", true], | ||||
| 	["[$-1010409]dddd, mmmm dd, yyyy", true], | ||||
| 	["[$-1010409]m/d/yyyy", true], | ||||
| 	["[$-1409]h:mm:ss\\ AM/PM;@", true], | ||||
| 	["[$-2000000]h:mm:ss;@", true], | ||||
| 	["[$-2010401]d/mm/yyyy\\ h:mm\\ AM/PM;@", true], | ||||
| 	["[$-4000439]h:mm:ss\\ AM/PM;@", true], | ||||
| 	["[$-4010439]d/m/yyyy\\ h:mm\\ AM/PM;@", true], | ||||
| 	["[$-409]AM/PM\\ hh:mm:ss;@", true], | ||||
| 	["[$-409]d/m/yyyy\\ hh:mm;@", true], | ||||
| 	["[$-409]d\\-mmm;@", true], | ||||
| 	["[$-409]d\\-mmm\\-yy;@", true], | ||||
| 	["[$-409]d\\-mmm\\-yyyy;@", true], | ||||
| 	["[$-409]dd/mm/yyyy\\ hh:mm;@", true], | ||||
| 	["[$-409]dd\\-mmm\\-yy;@", true], | ||||
| 	["[$-409]h:mm:ss\\ AM/PM;@", true], | ||||
| 	["[$-409]h:mm\\ AM/PM;@", true], | ||||
| 	["[$-409]m/d/yy\\ h:mm\\ AM/PM;@", true], | ||||
| 	["[$-409]mmm\\-yy;@", true], | ||||
| 	["[$-409]mmmm\\ d\\,\\ yyyy;@", true], | ||||
| 	["[$-409]mmmm\\-yy;@", true], | ||||
| 	["[$-409]mmmmm;@", true], | ||||
| 	["[$-409]mmmmm\\-yy;@", true], | ||||
| 	["[$-40E]h\\ \"óra\"\\ m\\ \"perckor\"\\ AM/PM;@", true], | ||||
| 	["[$-412]AM/PM\\ h\"시\"\\ mm\"분\"\\ ss\"초\";@", true], | ||||
| 	["[$-41C]h:mm:ss\\.AM/PM;@", true], | ||||
| 	["[$-449]hh:mm:ss\\ AM/PM;@", true], | ||||
| 	["[$-44E]hh:mm:ss\\ AM/PM;@", true], | ||||
| 	["[$-44F]hh:mm:ss\\ AM/PM;@", true], | ||||
| 	["[$-D000409]h:mm\\ AM/PM;@", true], | ||||
| 	["[$-D010000]d/mm/yyyy\\ h:mm\\ \"น.\";@", true], | ||||
| 	["[$-F400]h:mm:ss\\ AM/PM", true], | ||||
| 	["[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy", true], | ||||
| 	["[$AUD]\\ #,##0.00", false], | ||||
| 	["[$RD$-1C0A]#,##0.00;[Red]\\-[$RD$-1C0A]#,##0.00", false], | ||||
| 	["[$SFr.-810]\\ #,##0.00_);[Red]\\([$SFr.-810]\\ #,##0.00\\)", false], | ||||
| 	["[$£-809]#,##0.00;[Red][$£-809]#,##0.00", false], | ||||
| 	["[$¥-411]#,##0.00", false], | ||||
| 	["[$¥-804]#,##0.00", false], | ||||
| 	["[<0]\"\";0%", false], | ||||
| 	["[<=9999999]###\\-####;\\(###\\)\\ ###\\-####", false], | ||||
| 	["[=0]?;#,##0.00", false], | ||||
| 	["[=0]?;0%", false], | ||||
| 	["[=0]?;[<4.16666666666667][hh]:mm:ss;[hh]:mm", true], | ||||
| 	["[>999999]#,,\"M\";[>999]#,\"K\";#", false], | ||||
| 	["[>999999]#.000,,\"M\";[>999]#.000,\"K\";#.000", false], | ||||
| 	["[>=100000]0.000\\ \\\";[Red]0.000\\ \\<\\ \\>\\ \\\"\\ \\&\\ \\'\\ ", false], | ||||
| 	["[>=100000]0.000\\ \\<;[Red]0.000\\ \\>", false], | ||||
| 	["[BLACK]@", false], | ||||
| 	["[BLUE]GENERAL", false], | ||||
| 	["[Black]@", false], | ||||
| 	["[Blue]General", false], | ||||
| 	["[CYAN]@", false], | ||||
| 	["[Cyan]@", false], | ||||
| 	["[DBNum1][$-804]AM/PMh\"时\"mm\"分\";@", true], | ||||
| 	["[DBNum1][$-804]General", false], | ||||
| 	["[DBNum1][$-804]h\"时\"mm\"分\";@", true], | ||||
| 	["[ENG][$-1004]dddd\\,\\ d\\ mmmm\\,\\ yyyy;@", true], | ||||
| 	["[ENG][$-101040D]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-101042A]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-140C]dddd\\ \"YeahWoo!\"\\ ddd\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-2C0A]dddd\\ d\" de \"mmmm\" de \"yyyy;@", true], | ||||
| 	["[ENG][$-402]dd\\ mmmm\\ yyyy\\ \"г.\";@", true], | ||||
| 	["[ENG][$-403]dddd\\,\\ d\" / \"mmmm\" / \"yyyy;@", true], | ||||
| 	["[ENG][$-405]d\\.\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-408]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-409]d\\-mmm;@", true], | ||||
| 	["[ENG][$-409]d\\-mmm\\-yy;@", true], | ||||
| 	["[ENG][$-409]d\\-mmm\\-yyyy;@", true], | ||||
| 	["[ENG][$-409]dd\\-mmm\\-yy;@", true], | ||||
| 	["[ENG][$-409]mmm\\-yy;@", true], | ||||
| 	["[ENG][$-409]mmmm\\ d\\,\\ yyyy;@", true], | ||||
| 	["[ENG][$-409]mmmm\\-yy;@", true], | ||||
| 	["[ENG][$-40B]d\\.\\ mmmm\\t\\a\\ yyyy;@", true], | ||||
| 	["[ENG][$-40C]d/mmm/yyyy;@", true], | ||||
| 	["[ENG][$-40E]yyyy/\\ mmmm\\ d\\.;@", true], | ||||
| 	["[ENG][$-40F]dd\\.\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-410]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-415]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-416]d\\ \\ mmmm\\,\\ yyyy;@", true], | ||||
| 	["[ENG][$-418]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-41A]d\\.\\ mmmm\\ yyyy\\.;@", true], | ||||
| 	["[ENG][$-41B]d\\.\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-41D]\"den \"\\ d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-420]dddd\\,\\ dd\\ mmmm\\,\\ yyyy;@", true], | ||||
| 	["[ENG][$-421]dd\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-424]dddd\\,\\ d\\.\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-425]dddd\\,\\ d\\.\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-426]dddd\\,\\ yyyy\". gada \"d\\.\\ mmmm;@", true], | ||||
| 	["[ENG][$-427]yyyy\\ \"m.\"\\ mmmm\\ d\\ \"d.\";@", true], | ||||
| 	["[ENG][$-42B]dddd\\,\\ d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-42C]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-42D]yyyy\"(e)ko\"\\ mmmm\"ren\"\\ d\"a\";@", true], | ||||
| 	["[ENG][$-42F]dddd\\,\\ dd\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-437]yyyy\\ \\წ\\ლ\\ი\\ს\\ dd\\ mm\\,\\ dddd;@", true], | ||||
| 	["[ENG][$-438]d\\.\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-43F]d\\ mmmm\\ yyyy\\ \"ж.\";@", true], | ||||
| 	["[ENG][$-444]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-449]dd\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-44E]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-44F]dd\\ mmmm\\ yyyy\\ dddd;@", true], | ||||
| 	["[ENG][$-457]dd\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-813]dddd\\ d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-81A]dddd\\,\\ d\\.\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-82C]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-843]yyyy\\ \"й\"\"и\"\"л\"\\ d/mmmm;@", true], | ||||
| 	["[ENG][$-C07]dddd\\,\\ dd\\.\\ mmmm\\ yyyy;@", true], | ||||
| 	["[ENG][$-FC19]yyyy\\,\\ dd\\ mmmm;@", true], | ||||
| 	["[ENG][$-FC22]d\\ mmmm\\ yyyy\" р.\";@", true], | ||||
| 	["[ENG][$-FC23]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[GREEN]#,###", false], | ||||
| 	["[Green]#,###", false], | ||||
| 	["[HH]", true], | ||||
| 	["[HIJ][$-2060401]d/mm/yyyy\\ h:mm\\ AM/PM;@", true], | ||||
| 	["[HIJ][$-2060401]d\\ mmmm\\ yyyy;@", true], | ||||
| 	["[H]", true], | ||||
| 	["[JPN][$-411]gggyy\"年\"m\"月\"d\"日\"\\ dddd;@", true], | ||||
| 	["[MAGENTA]0.00", false], | ||||
| 	["[Magenta]0.00", false], | ||||
| 	["[RED]#.##", false], | ||||
| 	["[Red]#.##", false], | ||||
| 	["[Red][<-25]General;[Blue][>25]General;[Green]General;[Yellow]General\\ ", false], | ||||
| 	["[Red][<=-25]General;[Blue][>=25]General;[Green]General;[Yellow]General", false], | ||||
| 	["[Red][<>50]General;[Blue]000", false], | ||||
| 	["[Red][=50]General;[Blue]000", false], | ||||
| 	["[SS]", true], | ||||
| 	["[S]", true], | ||||
| 	["[TWN][DBNum1][$-404]y\"年\"m\"月\"d\"日\";@", true], | ||||
| 	["[WHITE]0.0", false], | ||||
| 	["[White]0.0", false], | ||||
| 	["[YELLOW]@", false], | ||||
| 	["[Yellow]@", false], | ||||
| 	["[h]", true], | ||||
| 	["[h]:mm:ss", true], | ||||
| 	["[h]:mm:ss;@", true], | ||||
| 	["[h]\\.mm\" Uhr \";@", true], | ||||
| 	["[hh]", true], | ||||
| 	["[s]", true], | ||||
| 	["[ss]", true], | ||||
| 	["\\#\\r\\e\\c", false], | ||||
| 	["\\$#,##0_);[Red]\\\"($\\\"#,##0\\)", false], | ||||
| 	["\\$0.00", false], | ||||
| 	["\\C\\O\\B\\ \\o\\n\\ @", false], | ||||
| 	["\\C\\R\\O\\N\\T\\A\\B\\ \\o\\n\\ @", false], | ||||
| 	["\\R\\e\\s\\u\\l\\t\\ \\o\\n\\ @", false], | ||||
| 	["\\S\\Q\\L\\ \\:\\ @", false], | ||||
| 	["\\S\\Q\\L\\ \\R\\e\\q\\u\\e\\s\\t\\ \\f\\o\\r\\ @", false], | ||||
| 	["\\c\\c\\c?????0\"aaaa\"0\"bbbb\"000000.00%", false], | ||||
| 	["\\u\\n\\t\\i\\l\\ h:mm;@", true], | ||||
| 	["_ * #,##0.00_)[$﷼-429]_ ;_ * \\(#,##0.00\\)[$﷼-429]_ ;_ * \"-\"??_)[$﷼-429]_ ;_ @_ ", false], | ||||
| 	["_ * #,##0_ ;_ * \\-#,##0_ ;[Red]_ * \"-\"_ ;_ @_ ", false], | ||||
| 	["_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)", false], | ||||
| 	["_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"??_);_(@_)", false], | ||||
| 	["_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)", false], | ||||
| 	["_(* #,##0.0000_);_(* \\(#,##0.0000\\);_(* \"-\"??_);_(@_)", false], | ||||
| 	["_(* #,##0.000_);_(* \\(#,##0.000\\);_(* \"-\"??_);_(@_)", false], | ||||
| 	["_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)", false], | ||||
| 	["_(* #,##0.0_);_(* \\(#,##0.0\\);_(* \"-\"??_);_(@_)", false], | ||||
| 	["_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"??_);_(@_)", false], | ||||
| 	["_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)", false], | ||||
| 	["_([$ANG]\\ * #,##0.0_);_([$ANG]\\ * \\(#,##0.0\\);_([$ANG]\\ * \"-\"?_);_(@_)", false], | ||||
| 	["_-\"€\"\\ * #,##0.00_-;_-\"€\"\\ * #,##0.00\\-;_-\"€\"\\ * \"-\"??_-;_-@_-", false], | ||||
| 	["_-* #,##0.00\" TL\"_-;\\-* #,##0.00\" TL\"_-;_-* \\-??\" TL\"_-;_-@_-", false], | ||||
| 	["_-* #,##0.00\" €\"_-;\\-* #,##0.00\" €\"_-;_-* \\-??\" €\"_-;_-@_-", false], | ||||
| 	["_-* #,##0.00\\ \"р.\"_-;\\-* #,##0.00\\ \"р.\"_-;_-* \"-\"??\\ \"р.\"_-;_-@_-", false], | ||||
| 	["_-* #,##0.00\\ \"€\"_-;\\-* #,##0.00\\ \"€\"_-;_-* \"-\"??\\ \"€\"_-;_-@_-", false], | ||||
| 	["_-* #,##0.00\\ [$€-407]_-;\\-* #,##0.00\\ [$€-407]_-;_-* \\-??\\ [$€-407]_-;_-@_-", false], | ||||
| 	["_-* #,##0.0\\ _F_-;\\-* #,##0.0\\ _F_-;_-* \"-\"??\\ _F_-;_-@_-", false], | ||||
| 	["_-* #,##0\\ \"€\"_-;\\-* #,##0\\ \"€\"_-;_-* \"-\"\\ \"€\"_-;_-@_-", false], | ||||
| 	["_-* #,##0_-;\\-* #,##0_-;_-* \"-\"??_-;_-@_-", false], | ||||
| 	["_-\\$* #,##0.0_ ;_-\\$* \\-#,##0.0\\ ;_-\\$* \"-\"?_ ;_-@_ ", false], | ||||
| 	["d", true], | ||||
| 	["d-mmm", true], | ||||
| 	["d-mmm-yy", true], | ||||
| 	["d/m", true], | ||||
| 	["d/m/yy;@", true], | ||||
| 	["d/m/yyyy;@", true], | ||||
| 	["d/mm/yy;@", true], | ||||
| 	["d/mm/yyyy;@", true], | ||||
| 	["d\\-mmm", true], | ||||
| 	["d\\-mmm\\-yyyy", true], | ||||
| 	["dd", true], | ||||
| 	["dd\"-\"mmm\"-\"yyyy", true], | ||||
| 	["dd/m/yyyy", true], | ||||
| 	["dd/mm/yy", true], | ||||
| 	["dd/mm/yy;@", true], | ||||
| 	["dd/mm/yy\\ hh:mm", true], | ||||
| 	["dd/mm/yyyy", true], | ||||
| 	["dd/mm/yyyy\\ hh:mm:ss", true], | ||||
| 	["dd/mmm", true], | ||||
| 	["dd\\-mm\\-yy", true], | ||||
| 	["dd\\-mmm\\-yy", true], | ||||
| 	["dd\\-mmm\\-yyyy\\ hh:mm:ss.000", true], | ||||
| 	["dd\/mm\/yy", true], | ||||
| 	["dd\/mm\/yyyy", true], | ||||
| 	["ddd", true], | ||||
| 	["dddd", true], | ||||
| 	["dddd, mmmm dd, yyyy", true], | ||||
| 	["h", true], | ||||
| 	["h\"时\"mm\"分\"ss\"秒\";@", true], | ||||
| 	["h\"時\"mm\"分\"ss\"秒\";@", true], | ||||
| 	["h:mm", true], | ||||
| 	["h:mm AM/PM", true], | ||||
| 	["h:mm:ss", true], | ||||
| 	["h:mm:ss AM/PM", true], | ||||
| 	["h:mm:ss;@", true], | ||||
| 	["h:mm;@", true], | ||||
| 	["h\\.mm\" Uhr \";@", true], | ||||
| 	["h\\.mm\" h\";@", true], | ||||
| 	["h\\.mm\" u.\";@", true], | ||||
| 	["hh\":\"mm AM/PM", true], | ||||
| 	["hh:mm:ss", true], | ||||
| 	["hh:mm:ss\\ AM/PM", true], | ||||
| 	["hh\\.mm\" h\";@", true], | ||||
| 	["hhm", true], | ||||
| 	["hhmm", true], | ||||
| 	["m\"月\"d\"日\"", true], | ||||
| 	["m/d/yy", true], | ||||
| 	["m/d/yy h:mm", true], | ||||
| 	["m/d/yy;@", true], | ||||
| 	["m/d/yy\\ h:mm", true], | ||||
| 	["m/d/yy\\ h:mm;@", true], | ||||
| 	["m/d/yyyy", true], | ||||
| 	["m/d/yyyy;@", true], | ||||
| 	["m/d/yyyy\\ h:mm:ss;@", true], | ||||
| 	["m/d;@", true], | ||||
| 	["m\/d\/yyyy", true], | ||||
| 	["mm/dd", true], | ||||
| 	["mm/dd/yy", true], | ||||
| 	["mm/dd/yy;@", true], | ||||
| 	["mm/dd/yyyy", true], | ||||
| 	["mm:ss", true], | ||||
| 	["mm:ss.0;@", true], | ||||
| 	["mmm d, yyyy", true], | ||||
| 	["mmm\" \"d\", \"yyyy", true], | ||||
| 	["mmm-yy", true], | ||||
| 	["mmm-yy;@", true], | ||||
| 	["mmm/yy", true], | ||||
| 	["mmm\\-yy", true], | ||||
| 	["mmm\\-yy;@", true], | ||||
| 	["mmm\\-yyyy", true], | ||||
| 	["mmmm\\ d\\,\\ yyyy", true], | ||||
| 	["mmmm\\ yyyy", true], | ||||
| 	["mmss.0", true], | ||||
| 	["s", true], | ||||
| 	["ss", true], | ||||
| 	["yy", true], | ||||
| 	["yy/mm/dd", true], | ||||
| 	["yy\\.mm\\.dd", true], | ||||
| 	["yym", true], | ||||
| 	["yymm", true], | ||||
| 	["yymmm", true], | ||||
| 	["yymmmm", true], | ||||
| 	["yymmmmm", true], | ||||
| 	["yyyy", true], | ||||
| 	["yyyy\"년\"\\ m\"월\"\\ d\"일\";@", true], | ||||
| 	["yyyy-m-d h:mm AM/PM", true], | ||||
| 	["yyyy-mm-dd", true], | ||||
| 	["yyyy/mm/dd", true], | ||||
| 	["yyyy\\-m\\-d\\ hh:mm:ss", true], | ||||
| 	["yyyy\\-mm\\-dd", true], | ||||
| 	["yyyy\\-mm\\-dd;@", true], | ||||
| 	["yyyy\\-mm\\-dd\\ h:mm", true], | ||||
| 	["yyyy\\-mm\\-dd\\Thh:mm", true], | ||||
| 	["yyyy\\-mm\\-dd\\Thhmmss.000", true], | ||||
| 	["###,##0", false], | ||||
| 	["#,###.00", false] | ||||
| ] | ||||
							
								
								
									
										57
									
								
								packages/ssf/test/negative.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										57
									
								
								packages/ssf/test/negative.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| /*eslint-env mocha, node */ | ||||
| var SSF = require('../'); | ||||
| var assert = require('assert'); | ||||
| 
 | ||||
| /* {format, data:[[value, result]]} */ | ||||
| var data = [ | ||||
| 	{ | ||||
| 		format: '"$"#,##0_);\\("$"#,##0\\);"-"', | ||||
| 		data: [ | ||||
| 			[10000,    "$10,000 "], | ||||
| 			[9000.98,   "$9,001 "], | ||||
| 			[100,         "$100 "], | ||||
| 			[50.02,        "$50 "], | ||||
| 			[1,             "$1 "], | ||||
| 			[0.1,           "$0 "], | ||||
| 			[0.01,          "$0 "], | ||||
| 			[0,               "-"], | ||||
| 			[-10000,  "($10,000)"], | ||||
| 			[-9000.98, "($9,001)"], | ||||
| 			[-100,       "($100)"], | ||||
| 			[-50.02,      "($50)"], | ||||
| 			[-1,           "($1)"], | ||||
| 			[-0.1,         "($0)"], | ||||
| 			[-0.01,        "($0)"] | ||||
| 		] | ||||
| 	}, | ||||
| 	{ | ||||
| 		format: '(#,##0.00)', | ||||
| 		data: [ | ||||
| 			[-12345.6789, "-(12,345.68)"] | ||||
| 		] | ||||
| 	}, | ||||
| 	{ | ||||
| 		format: '#,##0.00;\\(#,##0.00\\)', | ||||
| 		data: [ | ||||
| 			[-12345.6789, "(12,345.68)"] | ||||
| 		] | ||||
| 	}, | ||||
| 	{ | ||||
| 		format: '[<=9999999]###\\-####;(###) ###\\-####', | ||||
| 		data: [ | ||||
| 			[2813308004, '(281) 330-8004'] | ||||
| 		] | ||||
| 	} | ||||
| ]; | ||||
| 
 | ||||
| describe("negatives", function() { | ||||
| 	data.forEach(function(row) { | ||||
| 		it(row.format, function() { | ||||
| 			row.data.forEach(function(r) { | ||||
| 				assert.equal(SSF.format(row.format, r[0]), r[1]); | ||||
| 			}); | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
							
								
								
									
										22
									
								
								packages/ssf/test/oddities.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										22
									
								
								packages/ssf/test/oddities.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var data = JSON.parse(fs.readFileSync('./test/oddities.json','utf8')); | ||||
| describe('oddities', function() { | ||||
|   data.forEach(function(d) { | ||||
|     it(String(d[0]), function(){ | ||||
|       for(var j=1;j<d.length;++j) { | ||||
|         if(d[j].length == 2) { | ||||
|           var expected = d[j][1], actual = SSF.format(d[0], d[j][0], {}); | ||||
|           assert.equal(actual, expected); | ||||
|         } else if(d[j][2] !== "#") assert.throws(function() { SSF.format(d[0], d[j][0]); }); | ||||
|       } | ||||
|     }); | ||||
|   }); | ||||
|   it('should fail for bad formats', function() { | ||||
|     var bad = ['##,##']; | ||||
|     var chk = function(fmt){ return function(){ SSF.format(fmt,0); }; }; | ||||
|     bad.forEach(function(fmt){assert.throws(chk(fmt));}); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										180
									
								
								packages/ssf/test/oddities.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										180
									
								
								packages/ssf/test/oddities.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,180 @@ | ||||
| [ | ||||
|   ["\"foo\";\"bar\";\"baz\";\"qux\"", | ||||
|     [1, "foo"], [-1, "bar"], [0, "baz"], ["sheetjs", "qux"] | ||||
|   ], | ||||
|   ["\"foo\";\"bar\";\"baz\"", | ||||
|     [1, "foo"], [-1, "bar"], [0, "baz"], ["sheetjs", "sheetjs"] | ||||
|   ], | ||||
|   ["\"foo\";\"bar\";@", | ||||
|     [1, "foo"], [-1, "bar"], [0, "foo"], ["sheetjs", "sheetjs"] | ||||
|   ], | ||||
|   ["\"foo\";\"bar\"", | ||||
|     [1, "foo"], [-1, "bar"], [0, "foo"], ["sheetjs", "sheetjs"] | ||||
|   ], | ||||
|   ["@@", [1, "1"], [-1, "-1"], [0, "0"], ["sheetjs", "sheetjssheetjs"]], | ||||
|   ["[Blue]General", [1, "1"], [-1, "-1"], [0, "0"], ["sheetjs", "sheetjs"]], | ||||
|   ["[Blue]G3neral", [1], [-1], [0], ["TODO","TODO"]], | ||||
|   ["A\"TODO\"", [1, "ATODO"], [-1, "ATODO"], [0, "ATODO"], ["TODO","TODO"]], | ||||
|   ["r", [1,"r"], [-1,"-r","#"], [0,"r"], ["sheetjs","sheetjs"]], | ||||
|   ["((;@", [1,"(("], [0,"(("], ["foo","foo"]], | ||||
|   ["\\r", [1, "r"], [-1, "r"], [0, "r"], ["TODO","TODO"]], | ||||
|   ["_($* #,##0_);_($* (#,##0);_($* \"-\"_);_(@_)", [1, " $1 "], [-1, " $(1)"], [0," $- "], ["TODO", " TODO "], ["",""]], | ||||
|   ["#0.#", [0,"0."], [1,"1."], [12,"12."], [12.34, "12.3"], [-1.23, "-1.2"]], | ||||
|   ["#,##0.0", [1,"1.0"], [-1,"-1.0"], [0,"0.0"], ["TODO","TODO"]], | ||||
|   ["#,##0.00", [1,"1.00"], [-1,"-1.00"], [0,"0.00"], ["TODO","TODO"]], | ||||
|   ["#,##0.000", [1,"1.000"], [-1,"-1.000"], [0,"0.000"], ["TODO","TODO"]], | ||||
|   ["#,##0.0000", [1,"1.0000"], [-1,"-1.0000"], [0,"0.0000"], ["TODO","TODO"]], | ||||
|   ["#,##0.00000", [1000000, "1,000,000.00000"]], | ||||
|   ["#,##0.000000", [1000000, "1,000,000.000000"]], | ||||
|   ["#,##0.0000000", [1000000, "1,000,000.0000000"]], | ||||
|   ["#,##0.00000000", [1000000, "1,000,000.00000000"]], | ||||
|   ["#,##0.000000000", [1000000, "1,000,000.000000000"]], | ||||
|   ["#,###", [1, "1"], [-1, "-1"], [0,""], [12345.6789, "12,346"], ["TODO", "TODO"]], | ||||
|   ["#.##", [1, "1."], [-1, "-1."], [0,"."], ["sheetjs", "sheetjs"]], | ||||
|   ["0;0", [1.1, "1"], [-1.1, "1"], [0,"0"], ["sheetjs", "sheetjs"]], | ||||
|   ["0.0", [1, "1.0"], [-1, "-1.0"], [0,"0.0"], ["sheetjs", "sheetjs"]], | ||||
|   ["0.00", [1.0001, "1.00"], [-1, "-1.00"], [0,"0.00"], ["sheetjs", "sheetjs"]], | ||||
|   ["0.000", [1, "1.000"], [-1, "-1.000"], [0,"0.000"], ["sheetjs", "sheetjs"]], | ||||
|   ["0.0000", [1, "1.0000"], [-1, "-1.0000"], [0,"0.0000"], ["sheetjs", "sheetjs"]], | ||||
|   ["hh:mm AM/PM", [0.7, "04:48 PM"]], | ||||
|   ["hhh:mm AM/PM", [0.7]], | ||||
|   ["hhh:mmm:sss", [0.7]], | ||||
|   ["hh:mmm:sss", [0.7]], | ||||
|   ["hh:mm:sss", [0.7]], | ||||
|   ["hh:mm:ss.000", [0.7,"16:48:00.000"], [0.70707,"16:58:10.848"]], | ||||
|   ["hh.000", [0.70707, "16.848"]], | ||||
|   ["hh .00", [0.70707, "16 .85"]], | ||||
|   ["hh  .0", [0.70707, "16  .8"]], | ||||
|   ["hh .00 .000", [0.70707, "16 .84 .848"]], | ||||
|   ["[hhh]", [0.7]], | ||||
|   ["[", [0.7]], | ||||
|   ["A/P", [0.7, "P"]], | ||||
|   ["e", [0.7, "1900"]], | ||||
|   ["123", [0.7, "123"], [0, "123"], ["sheetjs", "sheetjs"]], | ||||
|   ["0.##", [1,"1."], [-1,"-1."], [0, "0."], [1.1, "1.1"], [-1.2, "-1.2"], [1000000000000.01, "1000000000000.01"], [-1000.01, "-1000.01"], [0.1, "0.1"], [1.007, "1.01"], [-1.008, "-1.01"]], | ||||
|   ["** #,###,#00,000.00,**", | ||||
|     [1.2345,                                    " 00,000.00"], | ||||
|     [12.345,                                    " 00,000.01"], | ||||
|     [123.45,                                    " 00,000.12"], | ||||
|     [1234.56,                                   " 00,001.23"], | ||||
|     [12345.67,                                  " 00,012.35"], | ||||
|     [123456.78,                                 " 00,123.46"], | ||||
|     [1234567.89,                                " 01,234.57"], | ||||
|     [12345681.9,                                " 12,345.68"], | ||||
|     [123456822,                                " 123,456.82"], | ||||
|     [1234568223,                             " 1,234,568.22"], | ||||
|     [12345682233,                           " 12,345,682.23"], | ||||
|     [123456822333,                         " 123,456,822.33"], | ||||
|     [1234568223333,                      " 1,234,568,223.33"], | ||||
|     [12345682233333,                    " 12,345,682,233.33"], | ||||
|     [123456822333333,                  " 123,456,822,333.33"], | ||||
|     [1234568223333330,               " 1,234,568,223,333.33"], | ||||
|     [12345682233333300,             " 12,345,682,233,333.30"], | ||||
|     [123456822333333000,           " 123,456,822,333,333.00", "#"], | ||||
|     [1234568223333330000,        " 1,234,568,223,333,330.00"], | ||||
|     [12345682233333300000,      " 12,345,682,233,333,300.00"], | ||||
|     [123456822333333000000,    " 123,456,822,333,333,000.00"], | ||||
|     [1234568223333330000000, " 1,234,568,223,333,330,000.00"] | ||||
|   ], | ||||
|   ["00,000.00,", [12345, "00,012.35"] ], | ||||
|   ["00,000.00", [12345, "12,345.00"] ], | ||||
|   ["000#0#0#0##00##00##0#########", [12345, "0000000000012345"] ], | ||||
|   ["##0.0E+0", | ||||
|     [1,           "1.0E+0"], | ||||
|     [12,         "12.0E+0"], | ||||
|     [123,       "123.0E+0"], | ||||
|     [1234,        "1.2E+3"], | ||||
|     [12345,      "12.3E+3"], | ||||
|     [123456,    "123.5E+3"], | ||||
|     [1234567,     "1.2E+6"], | ||||
|     [12345678,   "12.3E+6"], | ||||
|     [123456789, "123.5E+6"] | ||||
|   ], | ||||
|   ["0#######0.##0##0######00######0", | ||||
|     [12.3456789, "012.3456789000"], | ||||
|     [123456789, "123456789.00000"] | ||||
|   ], | ||||
|   ["###\\###\\##0.00", | ||||
|     [0.00101,              "##0.00"], | ||||
|     [0.0101,               "##0.01"], | ||||
|     [0.101,                "##0.10"], | ||||
|     [1.01,                 "##1.01"], | ||||
|     [10.1,                "##10.10"], | ||||
|     [101,                "#1#01.00"], | ||||
|     [1010,              "#10#10.00"], | ||||
|     [10100,            "1#01#00.00"], | ||||
|     [101000,          "10#10#00.00"], | ||||
|     [1010000,        "101#00#00.00"], | ||||
|     [10100000,      "1010#00#00.00"], | ||||
|     [101000000,    "10100#00#00.00"], | ||||
|     [123456789.01,    "12345#67#89.01"] | ||||
|   ], | ||||
| 
 | ||||
|   ["###\\\\###\\\\##\\0.00", | ||||
|     [0.00101,              "\\\\0.00"], | ||||
|     [0.0101,               "\\\\0.01"], | ||||
|     [0.101,                "\\\\0.10"], | ||||
|     [1.01,                "\\\\10.01"], | ||||
|     [10.1,               "\\\\100.10"], | ||||
|     [101,               "\\1\\010.00"], | ||||
|     [1010,             "\\10\\100.00"], | ||||
|     [10100,           "\\101\\000.00"], | ||||
|     [101000,         "1\\010\\000.00"], | ||||
|     [1010000,       "10\\100\\000.00"], | ||||
|     [10100000,     "101\\000\\000.00"], | ||||
|     [101000000,   "1010\\000\\000.00"], | ||||
|     [123456789.01,   "1234\\567\\890.01"] | ||||
|   ], | ||||
|   ["0.0#", | ||||
|     [12345.0, "12345.0"], | ||||
|     [1234.5,   "1234.5"], | ||||
|     [123.45,   "123.45"], | ||||
|     [12.345,    "12.35"], | ||||
|     [1.2345,     "1.23"], | ||||
|     [0.12345,    "0.12"], | ||||
|     [0.012345,   "0.01"], | ||||
|     [0.0012345,   "0.0"], | ||||
|     [0.00012345,  "0.0"], | ||||
|     [15.04,     "15.04"], | ||||
|     [15.06,     "15.06"] | ||||
|   ], | ||||
|   ["###\\\\###\\\\##\\0", [12345.6789, "\\123\\460"]], | ||||
|   ["00000-0000", [941051630, "94105-1630"], [12345.6789, "00001-2346"]], | ||||
|   ["000-00-0000", [123456789, "123-45-6789"]], | ||||
|   ["00000\\-0000", [941051630, "94105-1630"]], | ||||
|   ["000\\-00\\-0000", [123456789, "123-45-6789"]], | ||||
|   ["??/??", [12.3456789, "1000/81"], [0.00001, " 0/1 "]], | ||||
|   ["# ??/??", [12.3456789, "12 28/81"]], | ||||
|   ["#??/??", [12.3456789, "1000/81"]], | ||||
|   ["#0#00??/??", [12.3456789, "01000/81"]], | ||||
|   ["[<=9999999]###-####;(###) ###-####", [8675309, "867-5309"],[2813308004, "(281) 330-8004"], [2018675309, "(201) 867-5309"]], | ||||
|   ["[<=9999999]###\\-####;(###) ###\\-####", [8675309, "867-5309"],[2813308004, "(281) 330-8004"]], | ||||
|   ["[Red][<-25]General;[Blue][>25]General;[Green]General;[Yellow]General", [50, "50"],[26, "26"],[25,"25"],[1,"1"],[0,"0"],[-1,"-1"],[-25,"-25"],[-26,"26","#"],[-50.1,"50","#"], ["foo","foo"],["bar","bar"]], | ||||
|   ["[Red][<=-25]General;[Blue][>=25]General;[Green]General;[Yellow]General", [50, "50"],[26, "26"],[25,"25"],[1,"1"],[0,"0"],[-1,"-1"],[-25,"-25"],[-26.1,"26","#"],[-50,"50","#"], ["foo","foo"],["bar","bar"]], | ||||
|   ["[Red]General ;[Blue]General\\ ;[Green]Generalp;[Yellow]General'", [50, "50 "],[0,"0p"],[-25,"-25 "],["foo","foo'"]], | ||||
|   ["[Red][=50]General;[Blue]000", [50, "50"], [51, "051"], [49, "049"]], | ||||
|   ["[Red][<>50]General;[Blue]000", [50, "050"], [51, "51"], [49, "49"]], | ||||
|   ["b", [1,"43"], [1000,"45"], [10000,"70"]], | ||||
|   ["B2yyyymmdd", [0,"13170829"], [1000,"13200624","#"], [10000,"13451117","#"]], | ||||
|   ["☃", [0], [1], [-1]], | ||||
|   ["#0#######", [12345, "012345"], [12345.4321, "012345"], [12345.6789, "012346"]], | ||||
|   ["##,##", [12345, "12,345", ""], [12345.4321, "12,345", ""], [12345.6789, "12,346", ""]], | ||||
|   [0, [12345,"12345"], [4294967296.5, "4294967297"]], | ||||
|   ["\"Rs.\"#,##0.00", [-51968287, "-Rs.51,968,287.00"], [2000000, "Rs.2,000,000.00"]], | ||||
|   ["$#.00", [3.14159, "$3.14"], [-3.14159, "-$3.14"]], | ||||
|   ["\"This is a \".00\"test\"000", [-3.14159, "-This is a 3.14test159"], [3.14159, "This is a 3.14test159"]], | ||||
|   ["[$INR]\\ #,##0.00", [3.14159, "INR 3.14"], [-3.14159, "-INR 3.14"]], | ||||
|   ["[$₹-4009]\\ #,##0.00", [3.14159, "₹ 3.14"], [-3.14159, "-₹ 3.14"]], | ||||
|   ["[$£-809]#,##0.0000;\\-[$£-809]#,##0.0000", [3.14159, "£3.1416"], [-3.14159, "-£3.1416"]], | ||||
|   ["\"-\"0.00", [3.14159, "-3.14"], [-3.14159, "--3.14"]], | ||||
|   ["[$-409]mmm\\-yy", [12345, "Oct-33"]], | ||||
| 
 | ||||
|   ["\\,##.??;\\(#,###.??\\);0", [15,",15.  ","#"], [14.3453453,",14.35","#"], [12.1,",12.1 ","#"], [0,"0","#"], [-15,"(15.  )","#"], [-14.3453453,"(14.35)","#"], [-12.1,"(12.1 )","#"], [1,",1.  ","#"]], | ||||
|   ["\"£\"#.####;-\"£\"#.####", [3.141592654, "£3.1416"], [-3.141592654, "-£3.1416"]], | ||||
|   ["[h]:mm:ss;@", [2.9999999999999996, "72:00:00"]], | ||||
|   ["hh:mm:ss AM/PM", [0.5, "12:00:00 PM"]], | ||||
|   ["hh:mm:ss am/pm", [0.5, "12:00:00 PM"]], | ||||
|   ["hh:mm:ss AM/P", [0.5, "12:00:00 A1/P"]], | ||||
|   ["hh:mm:ss am/p", [0.5, "12:00:00 a1/p"]], | ||||
|   ["\"foo\";\"bar\";\"baz\";\"qux\";\"foobar\"", [1], [0], [-1], ["sheetjs"]] | ||||
| ] | ||||
							
								
								
									
										1048576
									
								
								packages/ssf/test/times.tsv
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1048576
									
								
								packages/ssf/test/times.tsv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										10
									
								
								packages/ssf/test/utilities.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								packages/ssf/test/utilities.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var is_date = JSON.parse(fs.readFileSync('./test/is_date.json','utf8')); | ||||
| describe('utilities', function() { | ||||
|   it('correctly determines if formats are dates', function() { | ||||
| 		is_date.forEach(function(d) { assert.equal(SSF.is_date(d[0]), d[1], d[0]); }); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										19
									
								
								packages/ssf/test/valid.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										19
									
								
								packages/ssf/test/valid.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| /* vim: set ts=2: */ | ||||
| /*jshint loopfunc:true, mocha:true, node:true */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'); | ||||
| var data = fs.readFileSync('./test/valid.tsv','utf8').split("\n"); | ||||
| var _data = [0, 1, -2, 3.45, -67.89, "foo"]; | ||||
| function doit(d) { | ||||
|   it(d[0], function() { | ||||
|     for(var w = 0; w < _data.length; ++w) { | ||||
|       SSF.format(d[0], _data[w]); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| describe('valid formats', function() { | ||||
|   for(var j=0;j<data.length;++j) { | ||||
|     if(!data[j]) return; | ||||
|     doit(data[j].replace(/#{255}/g,"").split("\t")); | ||||
|   } | ||||
| }); | ||||
							
								
								
									
										442
									
								
								packages/ssf/test/valid.tsv
									
									
									
									
									
										Normal file
									
								
							
							
								
									
								
								
								
								
								
									
									
								
							
						
						
									
										442
									
								
								packages/ssf/test/valid.tsv
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,442 @@ | ||||
| " Excellent" | ||||
| " Fair" | ||||
| " Good" | ||||
| " Poor" | ||||
| " Very Good" | ||||
| "$"#,##0 | ||||
| "$"#,##0.00 | ||||
| "$"#,##0.00_);[Red]\("$"#,##0.00\) | ||||
| "$"#,##0.00_);\("$"#,##0.00\) | ||||
| "$"#,##0;[Red]\-"$"#,##0 | ||||
| "$"#,##0_);[Red]\("$"#,##0\) | ||||
| "$"#,##0_);\("$"#,##0\) | ||||
| "Haha!"\ @\ "Yeah!" | ||||
| "TRUE";"TRUE";"FALSE" | ||||
| "True";"True";"False";@ | ||||
| "Years: "0 | ||||
| "Yes";"Yes";"No";@ | ||||
| "kl "hh:mm:ss;@ | ||||
| "£"#,##0.00 | ||||
| "£"#,##0;[Red]\-"£"#,##0 | ||||
| "€"#,##0.00 | ||||
| "€"\ #,##0.00_- | ||||
| "上午/下午 "hh"時"mm"分"ss"秒 " | ||||
| "¥"#,##0.00;"¥"\-#,##0.00 | ||||
| # | ||||
| # ?/? | ||||
| # ??/?? | ||||
| #" "?/? | ||||
| #" "??/?? | ||||
| #"abded"\ ??/?? | ||||
| ###0.00;-###0.00 | ||||
| ###0;-###0 | ||||
| ##0.0E+0 | ||||
| #,##0 | ||||
| #,##0 ;(#,##0) | ||||
| #,##0 ;[Red](#,##0) | ||||
| #,##0"р.";[Red]\-#,##0"р." | ||||
| #,##0.0 | ||||
| #,##0.00 | ||||
| #,##0.00 "<22>" | ||||
| #,##0.00 €;-#,##0.00 € | ||||
| #,##0.00"р.";[Red]\-#,##0.00"р." | ||||
| #,##0.000 | ||||
| #,##0.0000 | ||||
| #,##0.00000 | ||||
| #,##0.000000 | ||||
| #,##0.0000000 | ||||
| #,##0.00000000 | ||||
| #,##0.000000000 | ||||
| #,##0.00000000;[Red]#,##0.00000000 | ||||
| #,##0.0000_  | ||||
| #,##0.000_  | ||||
| #,##0.000_);\(#,##0.000\) | ||||
| #,##0.00;(#,##0.00) | ||||
| #,##0.00;(#,##0.00);0.00 | ||||
| #,##0.00;[Red](#,##0.00) | ||||
| #,##0.00;[Red]\(#,##0.00\) | ||||
| #,##0.00;\(#,##0.00\) | ||||
| #,##0.00[$₹-449]_);\(#,##0.00[$₹-449]\) | ||||
| #,##0.00\ "р." | ||||
| #,##0.00\ "р.";[Red]\-#,##0.00\ "р." | ||||
| #,##0.00\ [$€-407] | ||||
| #,##0.00\ [$€-40C] | ||||
| #,##0.00_);\(#,##0.00\) | ||||
| #,##0.00_р_.;[Red]\-#,##0.00_р_. | ||||
| #,##0.00_р_.;\-#,##0.00_р_. | ||||
| #,##0.0;[Red]#,##0.0 | ||||
| #,##0.0_ ;\-#,##0.0\  | ||||
| #,##0.0_);[Red]\(#,##0.0\) | ||||
| #,##0.0_);\(#,##0.0\) | ||||
| #,##0;\-#,##0;0 | ||||
| #,##0\ "р.";[Red]\-#,##0\ "р." | ||||
| #,##0\ "р.";\-#,##0\ "р." | ||||
| #,##0\ ;[Red]\(#,##0\) | ||||
| #,##0\ ;\(#,##0\) | ||||
| #,##0_  | ||||
| #,##0_ ;[Red]\-#,##0\  | ||||
| #,##0_);[Red]\(#,##0\) | ||||
| #,##0_р_.;[Red]\-#,##0_р_. | ||||
| #,##0_р_.;\-#,##0_р_. | ||||
| #.0000,, | ||||
| #0 | ||||
| #0.00 | ||||
| #0.0000 | ||||
| #\ ?/10 | ||||
| #\ ?/2 | ||||
| #\ ?/4 | ||||
| #\ ?/8 | ||||
| #\ ?/? | ||||
| #\ ??/100 | ||||
| #\ ??/100;[Red]\(#\ ??/16\) | ||||
| #\ ??/16 | ||||
| #\ ??/?? | ||||
| #\ ??/????????? | ||||
| #\ ???/??? | ||||
| **\ #,###,#00,000.00,** | ||||
| 0 | ||||
| 0"abde".0"??"000E+00 | ||||
| 0% | ||||
| 0.0 | ||||
| 0.0% | ||||
| 0.00 | ||||
| 0.00"°" | ||||
| 0.00% | ||||
| 0.000 | ||||
| 0.000% | ||||
| 0.0000 | ||||
| 0.000000 | ||||
| 0.00000000 | ||||
| 0.000000000 | ||||
| 0.000000000% | ||||
| 0.00000000000 | ||||
| 0.000000000000000 | ||||
| 0.00000000E+00 | ||||
| 0.0000E+00 | ||||
| 0.00;[Red]0.00 | ||||
| 0.00E+00 | ||||
| 0.00_);[Red]\(0.00\) | ||||
| 0.00_);\(0.00\) | ||||
| 0.0_  | ||||
| 00.00.00.000 | ||||
| 00.000% | ||||
| 0000 | ||||
| 00000 | ||||
| 00000000 | ||||
| 000000000 | ||||
| 00000\-0000 | ||||
| 00000\-00000 | ||||
| 000\-00\-0000 | ||||
| 0;[Red]0 | ||||
| 0\-00000\-00000\-0 | ||||
| 0_);[Red]\(0\) | ||||
| 0_);\(0\) | ||||
| @ | ||||
| A/P | ||||
| AM/PM | ||||
| AM/PMh"時"mm"分"ss"秒";@ | ||||
| D | ||||
| DD | ||||
| DD/MM/YY;@ | ||||
| DD/MM/YYYY | ||||
| DD/MM/YYYY;@ | ||||
| DDD | ||||
| DDDD | ||||
| DDDD", "MMMM\ DD", "YYYY | ||||
| GENERAL | ||||
| General | ||||
| H | ||||
| H:MM:SS\ AM/PM | ||||
| HH:MM | ||||
| HH:MM:SS\ AM/PM | ||||
| HHM | ||||
| HHMM | ||||
| HH[MM] | ||||
| HH[M] | ||||
| M/D/YYYY | ||||
| M/D/YYYY\ H:MM | ||||
| MM/DD/YY | ||||
| S | ||||
| SS | ||||
| YY | ||||
| YYM | ||||
| YYMM | ||||
| YYMMM | ||||
| YYMMMM | ||||
| YYMMMMM | ||||
| YYYY | ||||
| YYYY-MM-DD HH:MM:SS | ||||
| YYYY\-MM\-DD | ||||
| [$$-409]#,##0 | ||||
| [$$-409]#,##0.00 | ||||
| [$$-409]#,##0.00_);[Red]\([$$-409]#,##0.00\) | ||||
| [$$-C09]#,##0.00 | ||||
| [$-100042A]h:mm:ss\ AM/PM;@ | ||||
| [$-1010409]0.000% | ||||
| [$-1010409]General | ||||
| [$-1010409]d/m/yyyy\ h:mm\ AM/PM;@ | ||||
| [$-1010409]dddd, mmmm dd, yyyy | ||||
| [$-1010409]m/d/yyyy | ||||
| [$-1409]h:mm:ss\ AM/PM;@ | ||||
| [$-2000000]h:mm:ss;@ | ||||
| [$-2010401]d/mm/yyyy\ h:mm\ AM/PM;@ | ||||
| [$-4000439]h:mm:ss\ AM/PM;@ | ||||
| [$-4010439]d/m/yyyy\ h:mm\ AM/PM;@ | ||||
| [$-409]AM/PM\ hh:mm:ss;@ | ||||
| [$-409]d/m/yyyy\ hh:mm;@ | ||||
| [$-409]d\-mmm;@ | ||||
| [$-409]d\-mmm\-yy;@ | ||||
| [$-409]d\-mmm\-yyyy;@ | ||||
| [$-409]dd/mm/yyyy\ hh:mm;@ | ||||
| [$-409]dd\-mmm\-yy;@ | ||||
| [$-409]h:mm:ss\ AM/PM;@ | ||||
| [$-409]h:mm\ AM/PM;@ | ||||
| [$-409]m/d/yy\ h:mm\ AM/PM;@ | ||||
| [$-409]mmm\-yy;@ | ||||
| [$-409]mmmm\ d\,\ yyyy;@ | ||||
| [$-409]mmmm\-yy;@ | ||||
| [$-409]mmmmm;@ | ||||
| [$-409]mmmmm\-yy;@ | ||||
| [$-40E]h\ "óra"\ m\ "perckor"\ AM/PM;@ | ||||
| [$-412]AM/PM\ h"시"\ mm"분"\ ss"초";@ | ||||
| [$-41C]h:mm:ss\.AM/PM;@ | ||||
| [$-449]hh:mm:ss\ AM/PM;@ | ||||
| [$-44E]hh:mm:ss\ AM/PM;@ | ||||
| [$-44F]hh:mm:ss\ AM/PM;@ | ||||
| [$-D000409]h:mm\ AM/PM;@ | ||||
| [$-D010000]d/mm/yyyy\ h:mm\ "น.";@ | ||||
| [$-F400]h:mm:ss\ AM/PM | ||||
| [$-F800]dddd\,\ mmmm\ dd\,\ yyyy | ||||
| [$AUD]\ #,##0.00 | ||||
| [$RD$-1C0A]#,##0.00;[Red]\-[$RD$-1C0A]#,##0.00 | ||||
| [$SFr.-810]\ #,##0.00_);[Red]\([$SFr.-810]\ #,##0.00\) | ||||
| [$£-809]#,##0.00;[Red][$£-809]#,##0.00 | ||||
| [$¥-411]#,##0.00 | ||||
| [$¥-804]#,##0.00 | ||||
| [<0]"";0% | ||||
| [<=9999999]###\-####;\(###\)\ ###\-#### | ||||
| [=0]?;#,##0.00 | ||||
| [=0]?;0% | ||||
| [=0]?;[<4.16666666666667][hh]:mm:ss;[hh]:mm | ||||
| [>999999]#,,"M";[>999]#,"K";# | ||||
| [>999999]#.000,,"M";[>999]#.000,"K";#.000 | ||||
| [>=100000]0.000\ \";[Red]0.000\ \<\ \>\ \"\ \&\ \'\  | ||||
| [>=100000]0.000\ \<;[Red]0.000\ \> | ||||
| [BLACK]@ | ||||
| [BLUE]GENERAL | ||||
| [Black]@ | ||||
| [Blue]General | ||||
| [CYAN]@ | ||||
| [Cyan]@ | ||||
| [DBNum1][$-804]AM/PMh"时"mm"分";@ | ||||
| [DBNum1][$-804]General | ||||
| [DBNum1][$-804]h"时"mm"分";@ | ||||
| [ENG][$-1004]dddd\,\ d\ mmmm\,\ yyyy;@ | ||||
| [ENG][$-101040D]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-101042A]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-140C]dddd\ "YeahWoo!"\ ddd\ mmmm\ yyyy;@ | ||||
| [ENG][$-2C0A]dddd\ d" de "mmmm" de "yyyy;@ | ||||
| [ENG][$-402]dd\ mmmm\ yyyy\ "г.";@ | ||||
| [ENG][$-403]dddd\,\ d" / "mmmm" / "yyyy;@ | ||||
| [ENG][$-405]d\.\ mmmm\ yyyy;@ | ||||
| [ENG][$-408]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-409]d\-mmm;@ | ||||
| [ENG][$-409]d\-mmm\-yy;@ | ||||
| [ENG][$-409]d\-mmm\-yyyy;@ | ||||
| [ENG][$-409]dd\-mmm\-yy;@ | ||||
| [ENG][$-409]mmm\-yy;@ | ||||
| [ENG][$-409]mmmm\ d\,\ yyyy;@ | ||||
| [ENG][$-409]mmmm\-yy;@ | ||||
| [ENG][$-40B]d\.\ mmmm\t\a\ yyyy;@ | ||||
| [ENG][$-40C]d/mmm/yyyy;@ | ||||
| [ENG][$-40E]yyyy/\ mmmm\ d\.;@ | ||||
| [ENG][$-40F]dd\.\ mmmm\ yyyy;@ | ||||
| [ENG][$-410]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-415]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-416]d\ \ mmmm\,\ yyyy;@ | ||||
| [ENG][$-418]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-41A]d\.\ mmmm\ yyyy\.;@ | ||||
| [ENG][$-41B]d\.\ mmmm\ yyyy;@ | ||||
| [ENG][$-41D]"den "\ d\ mmmm\ yyyy;@ | ||||
| [ENG][$-420]dddd\,\ dd\ mmmm\,\ yyyy;@ | ||||
| [ENG][$-421]dd\ mmmm\ yyyy;@ | ||||
| [ENG][$-424]dddd\,\ d\.\ mmmm\ yyyy;@ | ||||
| [ENG][$-425]dddd\,\ d\.\ mmmm\ yyyy;@ | ||||
| [ENG][$-426]dddd\,\ yyyy". gada "d\.\ mmmm;@ | ||||
| [ENG][$-427]yyyy\ "m."\ mmmm\ d\ "d.";@ | ||||
| [ENG][$-42B]dddd\,\ d\ mmmm\ yyyy;@ | ||||
| [ENG][$-42C]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-42D]yyyy"(e)ko"\ mmmm"ren"\ d"a";@ | ||||
| [ENG][$-42F]dddd\,\ dd\ mmmm\ yyyy;@ | ||||
| [ENG][$-437]yyyy\ \წ\ლ\ი\ს\ dd\ mm\,\ dddd;@ | ||||
| [ENG][$-438]d\.\ mmmm\ yyyy;@ | ||||
| [ENG][$-43F]d\ mmmm\ yyyy\ "ж.";@ | ||||
| [ENG][$-444]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-449]dd\ mmmm\ yyyy;@ | ||||
| [ENG][$-44E]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-44F]dd\ mmmm\ yyyy\ dddd;@ | ||||
| [ENG][$-457]dd\ mmmm\ yyyy;@ | ||||
| [ENG][$-813]dddd\ d\ mmmm\ yyyy;@ | ||||
| [ENG][$-81A]dddd\,\ d\.\ mmmm\ yyyy;@ | ||||
| [ENG][$-82C]d\ mmmm\ yyyy;@ | ||||
| [ENG][$-843]yyyy\ "й""и""л"\ d/mmmm;@ | ||||
| [ENG][$-C07]dddd\,\ dd\.\ mmmm\ yyyy;@ | ||||
| [ENG][$-FC19]yyyy\,\ dd\ mmmm;@ | ||||
| [ENG][$-FC22]d\ mmmm\ yyyy" р.";@ | ||||
| [ENG][$-FC23]d\ mmmm\ yyyy;@ | ||||
| [GREEN]#,### | ||||
| [Green]#,### | ||||
| [HH] | ||||
| [HIJ][$-2060401]d/mm/yyyy\ h:mm\ AM/PM;@ | ||||
| [HIJ][$-2060401]d\ mmmm\ yyyy;@ | ||||
| [H] | ||||
| [JPN][$-411]gggyy"年"m"月"d"日"\ dddd;@ | ||||
| [MAGENTA]0.00 | ||||
| [Magenta]0.00 | ||||
| [RED]#.## | ||||
| [Red]#.## | ||||
| [Red][<-25]General;[Blue][>25]General;[Green]General;[Yellow]General\  | ||||
| [Red][<=-25]General;[Blue][>=25]General;[Green]General;[Yellow]General | ||||
| [Red][<>50]General;[Blue]000 | ||||
| [Red][=50]General;[Blue]000 | ||||
| [SS] | ||||
| [S] | ||||
| [TWN][DBNum1][$-404]y"年"m"月"d"日";@ | ||||
| [WHITE]0.0 | ||||
| [White]0.0 | ||||
| [YELLOW]@ | ||||
| [Yellow]@ | ||||
| [h] | ||||
| [h]:mm:ss | ||||
| [h]:mm:ss;@ | ||||
| [h]\.mm" Uhr ";@ | ||||
| [hh] | ||||
| [s] | ||||
| [ss] | ||||
| \#\r\e\c | ||||
| \$#,##0_);[Red]"($"#,##0\) | ||||
| \$0.00 | ||||
| \C\O\B\ \o\n\ @ | ||||
| \C\R\O\N\T\A\B\ \o\n\ @ | ||||
| \R\e\s\u\l\t\ \o\n\ @ | ||||
| \S\Q\L\ \:\ @ | ||||
| \S\Q\L\ \R\e\q\u\e\s\t\ \f\o\r\ @ | ||||
| \c\c\c?????0"aaaa"0"bbbb"000000.00% | ||||
| \u\n\t\i\l\ h:mm;@ | ||||
| _ "¥"* #,##0.00_ "Positive";_ "¥"* \-#,##0.00_ ;_ "¥"* "-"??_ "Negtive";_ @_ \ "Zero" | ||||
| _ * #,##0.00_)[$﷼-429]_ ;_ * \(#,##0.00\)[$﷼-429]_ ;_ * "-"??_)[$﷼-429]_ ;_ @_  | ||||
| _ * #,##0_ ;_ * \-#,##0_ ;[Red]_ * "-"_ ;_ @_  | ||||
| _("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_) | ||||
| _("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"??_);_(@_) | ||||
| _("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_) | ||||
| _(* #,##0.0000_);_(* \(#,##0.0000\);_(* "-"??_);_(@_) | ||||
| _(* #,##0.000_);_(* \(#,##0.000\);_(* "-"??_);_(@_) | ||||
| _(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_) | ||||
| _(* #,##0.0_);_(* \(#,##0.0\);_(* "-"??_);_(@_) | ||||
| _(* #,##0_);_(* \(#,##0\);_(* "-"??_);_(@_) | ||||
| _(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_) | ||||
| _([$ANG]\ * #,##0.0_);_([$ANG]\ * \(#,##0.0\);_([$ANG]\ * "-"?_);_(@_) | ||||
| _-"€"\ * #,##0.00_-;_-"€"\ * #,##0.00\-;_-"€"\ * "-"??_-;_-@_- | ||||
| _-* #,##0.00" TL"_-;\-* #,##0.00" TL"_-;_-* \-??" TL"_-;_-@_- | ||||
| _-* #,##0.00" €"_-;\-* #,##0.00" €"_-;_-* \-??" €"_-;_-@_- | ||||
| _-* #,##0.00\ "р."_-;\-* #,##0.00\ "р."_-;_-* "-"??\ "р."_-;_-@_- | ||||
| _-* #,##0.00\ "€"_-;\-* #,##0.00\ "€"_-;_-* "-"??\ "€"_-;_-@_- | ||||
| _-* #,##0.00\ [$€-407]_-;\-* #,##0.00\ [$€-407]_-;_-* \-??\ [$€-407]_-;_-@_- | ||||
| _-* #,##0.0\ _F_-;\-* #,##0.0\ _F_-;_-* "-"??\ _F_-;_-@_- | ||||
| _-* #,##0\ "€"_-;\-* #,##0\ "€"_-;_-* "-"\ "€"_-;_-@_- | ||||
| _-* #,##0_-;\-* #,##0_-;_-* "-"??_-;_-@_- | ||||
| _-\$* #,##0.0_ ;_-\$* \-#,##0.0\ ;_-\$* "-"?_ ;_-@_  | ||||
| d | ||||
| d-mmm | ||||
| d-mmm-yy | ||||
| d/m | ||||
| d/m/yy;@ | ||||
| d/m/yyyy;@ | ||||
| d/mm/yy;@ | ||||
| d/mm/yyyy;@ | ||||
| d\-mmm | ||||
| d\-mmm\-yyyy | ||||
| dd | ||||
| dd"-"mmm"-"yyyy | ||||
| dd/m/yyyy | ||||
| dd/mm/yy | ||||
| dd/mm/yy;@ | ||||
| dd/mm/yy\ hh:mm | ||||
| dd/mm/yyyy | ||||
| dd/mm/yyyy\ hh:mm:ss | ||||
| dd/mmm | ||||
| dd\-mm\-yy | ||||
| dd\-mmm\-yy | ||||
| dd\-mmm\-yyyy\ hh:mm:ss.000 | ||||
| dd\/mm\/yy | ||||
| dd\/mm\/yyyy | ||||
| ddd | ||||
| dddd | ||||
| dddd, mmmm dd, yyyy | ||||
| h | ||||
| h"时"mm"分"ss"秒";@ | ||||
| h"時"mm"分"ss"秒";@ | ||||
| h:mm | ||||
| h:mm AM/PM | ||||
| h:mm:ss | ||||
| h:mm:ss AM/PM | ||||
| h:mm:ss;@ | ||||
| h:mm;@ | ||||
| h\.mm" Uhr ";@ | ||||
| h\.mm" h";@ | ||||
| h\.mm" u.";@ | ||||
| hh":"mm AM/PM | ||||
| hh:mm:ss | ||||
| hh:mm:ss\ AM/PM | ||||
| hh\.mm" h";@ | ||||
| hhm | ||||
| hhmm | ||||
| m"月"d"日" | ||||
| m/d/yy | ||||
| m/d/yy h:mm | ||||
| m/d/yy;@ | ||||
| m/d/yy\ h:mm | ||||
| m/d/yy\ h:mm;@ | ||||
| m/d/yyyy | ||||
| m/d/yyyy;@ | ||||
| m/d/yyyy\ h:mm:ss;@ | ||||
| m/d;@ | ||||
| m\/d\/yyyy | ||||
| mm/dd | ||||
| mm/dd/yy | ||||
| mm/dd/yy;@ | ||||
| mm/dd/yyyy | ||||
| mm:ss | ||||
| mm:ss.0;@ | ||||
| mmm d, yyyy | ||||
| mmm" "d", "yyyy | ||||
| mmm-yy | ||||
| mmm-yy;@ | ||||
| mmm/yy | ||||
| mmm\-yy | ||||
| mmm\-yy;@ | ||||
| mmm\-yyyy | ||||
| mmmm\ d\,\ yyyy | ||||
| mmmm\ yyyy | ||||
| mmss.0 | ||||
| s | ||||
| ss | ||||
| yy | ||||
| yy/mm/dd | ||||
| yy\.mm\.dd | ||||
| yym | ||||
| yymm | ||||
| yymmm | ||||
| yymmmm | ||||
| yymmmmm | ||||
| yyyy | ||||
| yyyy"년"\ m"월"\ d"일";@ | ||||
| yyyy-m-d h:mm AM/PM | ||||
| yyyy-mm-dd | ||||
| yyyy/mm/dd | ||||
| yyyy\-m\-d\ hh:mm:ss | ||||
| yyyy\-mm\-dd | ||||
| yyyy\-mm\-dd;@ | ||||
| yyyy\-mm\-dd\ h:mm | ||||
| yyyy\-mm\-dd\Thh:mm | ||||
| yyyy\-mm\-dd\Thhmmss.000 | ||||
| Can't render this file because it contains an unexpected character in line 6 and column 3. | 
							
								
								
									
										5
									
								
								packages/ssf/types/.npmignore
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										5
									
								
								packages/ssf/types/.npmignore
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| Makefile | ||||
| *ssf*.ts | ||||
| doc.ts | ||||
| write.ts | ||||
| tslint.json | ||||
							
								
								
									
										13
									
								
								packages/ssf/types/bin_ssf.ts
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										13
									
								
								packages/ssf/types/bin_ssf.ts
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,13 @@ | ||||
| /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /* eslint-env node */ | ||||
| /* eslint no-console:0 */ | ||||
| /*jshint node:true */ | ||||
| /// <reference types="../node_modules/@types/node/" />
 | ||||
| import X = require('ssf'); | ||||
| const argv = process.argv.slice(2); | ||||
| if(argv.length < 2 || argv[0] === "-h" || argv[0] === "--help") { | ||||
| 	console.error("usage: ssf <format> <value>"); | ||||
| 	console.error("output: format_as_string|format_as_number|"); | ||||
| 	process.exit(0); | ||||
| } | ||||
| console.log(X.format(argv[0],argv[1]) + "|" + X.format(argv[0],+(argv[1])) + "|"); | ||||
							
								
								
									
										56
									
								
								packages/ssf/types/index.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										56
									
								
								packages/ssf/types/index.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| // TypeScript Version: 2.2
 | ||||
| 
 | ||||
| /** Version string */ | ||||
| export const version: string; | ||||
| 
 | ||||
| /** Render value using format string or code */ | ||||
| export function format(fmt: string|number, val: any, opts?: any): string; | ||||
| 
 | ||||
| /** Load format string */ | ||||
| export function load(fmt: string, idx?: number): number; | ||||
| 
 | ||||
| /** Test if the format is a Date format */ | ||||
| export function is_date(fmt: string): boolean; | ||||
| 
 | ||||
| 
 | ||||
| /** Format Table */ | ||||
| export interface SSF$Table { | ||||
| 	[key: number]: string; | ||||
| 	[key: string]: string; | ||||
| } | ||||
| 
 | ||||
| /** Get format table */ | ||||
| export function get_table(): SSF$Table; | ||||
| 
 | ||||
| /** Set format table */ | ||||
| export function load_table(tbl: SSF$Table): void; | ||||
| 
 | ||||
| 
 | ||||
| /** Parsed date */ | ||||
| export interface SSF$Date { | ||||
| 	/** number of whole days since relevant epoch, 0 <= D */ | ||||
| 	D: number; | ||||
| 	/** integral year portion, epoch_year <= y */ | ||||
| 	y: number; | ||||
| 	/** integral month portion, 1 <= m <= 12 */ | ||||
| 	m: number; | ||||
| 	/** integral day portion, subject to gregorian YMD constraints */ | ||||
| 	d: number; | ||||
| 	/** integral day of week (0=Sunday .. 6=Saturday) 0 <= q <= 6 */ | ||||
| 	q: number; | ||||
| 
 | ||||
| 	/** number of seconds since midnight, 0 <= T < 86400 */ | ||||
| 	T: number; | ||||
| 	/** integral number of hours since midnight, 0 <= H < 24 */ | ||||
| 	H: number; | ||||
| 	/** integral number of minutes since the last hour, 0 <= M < 60 */ | ||||
| 	M: number; | ||||
| 	/** integral number of seconds since the last minute, 0 <= S < 60 */ | ||||
| 	S: number; | ||||
| 	/** sub-second part of time, 0 <= u < 1 */ | ||||
| 	u: number; | ||||
| } | ||||
| 
 | ||||
| /** Parse numeric date code */ | ||||
| export function parse_date_code(v: number, opts?: any): SSF$Date; | ||||
							
								
								
									
										16
									
								
								packages/ssf/types/ssf-test.ts
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								packages/ssf/types/ssf-test.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| import { format, load, get_table, load_table, parse_date_code, is_date, SSF$Table, SSF$Date } from 'ssf'; | ||||
| 
 | ||||
| const t1: string = format("General", 123.456); | ||||
| const t2: string = format(0, 234.567); | ||||
| const t3: string = format("@", "1234.567"); | ||||
| 
 | ||||
| load('"This is "0.00', 70); | ||||
| load('"This is "0'); | ||||
| 
 | ||||
| const tbl: SSF$Table = get_table(); | ||||
| load_table(tbl); | ||||
| 
 | ||||
| const date: SSF$Date = parse_date_code(43150); | ||||
| const sum: number = date.D + date.T + date.y + date.m + date.d + date.H + date.M + date.S + date.q + date.u; | ||||
| 
 | ||||
| const isdate: boolean = is_date("YYYY-MM-DD"); | ||||
							
								
								
									
										15
									
								
								packages/ssf/types/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										15
									
								
								packages/ssf/types/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| { | ||||
|     "compilerOptions": { | ||||
|         "module": "commonjs", | ||||
|         "lib": [ "es5" ], | ||||
|         "noImplicitAny": true, | ||||
|         "noImplicitThis": true, | ||||
|         "strictNullChecks": false, | ||||
|         "baseUrl": ".", | ||||
|         "paths": { "ssf": ["."] }, | ||||
|         "types": [], | ||||
|         "noEmit": true, | ||||
|         "strictFunctionTypes": true, | ||||
|         "forceConsistentCasingInFileNames": true | ||||
|     } | ||||
| } | ||||
							
								
								
									
										18
									
								
								packages/ssf/types/tslint.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										18
									
								
								packages/ssf/types/tslint.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| { | ||||
| 	"extends": "dtslint/dtslint.json", | ||||
| 	"rules": { | ||||
| 		"no-implicit-dependencies": false, | ||||
| 		"whitespace": false, | ||||
| 		"no-sparse-arrays": false, | ||||
| 		"only-arrow-functions": false, | ||||
| 		"no-consecutive-blank-lines": false, | ||||
| 		"prefer-conditional-expression": false, | ||||
| 		"one-variable-per-declaration": false, | ||||
| 		"strict-export-declare-modifiers": false, | ||||
| 		"no-redundant-jsdoc": false, | ||||
| 		"no-any-union": false, | ||||
| 		"no-unnecessary-generics": false, | ||||
| 		"no-unnecessary-type-assertion": false, | ||||
| 		"prefer-template": false | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user