3245 <xsl:text> this.format = svg_text_to_multiline(this.format_elt); |
3253 <xsl:text> this.format = svg_text_to_multiline(this.format_elt); |
3246 </xsl:text> |
3254 </xsl:text> |
3247 <xsl:text> }, |
3255 <xsl:text> }, |
3248 </xsl:text> |
3256 </xsl:text> |
3249 </xsl:if> |
3257 </xsl:if> |
3250 </xsl:template> |
|
3251 <preamble:display/> |
|
3252 <xsl:template match="preamble:display"> |
|
3253 <xsl:text> |
|
3254 </xsl:text> |
|
3255 <xsl:text>/* </xsl:text> |
|
3256 <xsl:value-of select="local-name()"/> |
|
3257 <xsl:text> */ |
|
3258 </xsl:text> |
|
3259 <xsl:text> |
|
3260 </xsl:text> |
|
3261 <xsl:text>/* https://github.com/alexei/sprintf.js/blob/master/src/sprintf.js */ |
|
3262 </xsl:text> |
|
3263 <xsl:text>/* global window, exports, define */ |
|
3264 </xsl:text> |
|
3265 <xsl:text> |
|
3266 </xsl:text> |
|
3267 <xsl:text>!function() { |
|
3268 </xsl:text> |
|
3269 <xsl:text> 'use strict' |
|
3270 </xsl:text> |
|
3271 <xsl:text> |
|
3272 </xsl:text> |
|
3273 <xsl:text> var re = { |
|
3274 </xsl:text> |
|
3275 <xsl:text> not_string: /[^s]/, |
|
3276 </xsl:text> |
|
3277 <xsl:text> not_bool: /[^t]/, |
|
3278 </xsl:text> |
|
3279 <xsl:text> not_type: /[^T]/, |
|
3280 </xsl:text> |
|
3281 <xsl:text> not_primitive: /[^v]/, |
|
3282 </xsl:text> |
|
3283 <xsl:text> number: /[diefg]/, |
|
3284 </xsl:text> |
|
3285 <xsl:text> numeric_arg: /[bcdiefguxX]/, |
|
3286 </xsl:text> |
|
3287 <xsl:text> json: /[j]/, |
|
3288 </xsl:text> |
|
3289 <xsl:text> not_json: /[^j]/, |
|
3290 </xsl:text> |
|
3291 <xsl:text> text: /^[^%]+/, |
|
3292 </xsl:text> |
|
3293 <xsl:text> modulo: /^%{2}/, |
|
3294 </xsl:text> |
|
3295 <xsl:text> placeholder: /^%(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, |
|
3296 </xsl:text> |
|
3297 <xsl:text> key: /^([a-z_][a-z_\d]*)/i, |
|
3298 </xsl:text> |
|
3299 <xsl:text> key_access: /^\.([a-z_][a-z_\d]*)/i, |
|
3300 </xsl:text> |
|
3301 <xsl:text> index_access: /^\[(\d+)\]/, |
|
3302 </xsl:text> |
|
3303 <xsl:text> sign: /^[+-]/ |
|
3304 </xsl:text> |
|
3305 <xsl:text> } |
|
3306 </xsl:text> |
|
3307 <xsl:text> |
|
3308 </xsl:text> |
|
3309 <xsl:text> function sprintf(key) { |
|
3310 </xsl:text> |
|
3311 <xsl:text> // arguments is not an array, but should be fine for this call |
|
3312 </xsl:text> |
|
3313 <xsl:text> return sprintf_format(sprintf_parse(key), arguments) |
|
3314 </xsl:text> |
|
3315 <xsl:text> } |
|
3316 </xsl:text> |
|
3317 <xsl:text> |
|
3318 </xsl:text> |
|
3319 <xsl:text> function vsprintf(fmt, argv) { |
|
3320 </xsl:text> |
|
3321 <xsl:text> return sprintf.apply(null, [fmt].concat(argv || [])) |
|
3322 </xsl:text> |
|
3323 <xsl:text> } |
|
3324 </xsl:text> |
|
3325 <xsl:text> |
|
3326 </xsl:text> |
|
3327 <xsl:text> function sprintf_format(parse_tree, argv) { |
|
3328 </xsl:text> |
|
3329 <xsl:text> var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign |
|
3330 </xsl:text> |
|
3331 <xsl:text> for (i = 0; i < tree_length; i++) { |
|
3332 </xsl:text> |
|
3333 <xsl:text> if (typeof parse_tree[i] === 'string') { |
|
3334 </xsl:text> |
|
3335 <xsl:text> output += parse_tree[i] |
|
3336 </xsl:text> |
|
3337 <xsl:text> } |
|
3338 </xsl:text> |
|
3339 <xsl:text> else if (typeof parse_tree[i] === 'object') { |
|
3340 </xsl:text> |
|
3341 <xsl:text> ph = parse_tree[i] // convenience purposes only |
|
3342 </xsl:text> |
|
3343 <xsl:text> if (ph.keys) { // keyword argument |
|
3344 </xsl:text> |
|
3345 <xsl:text> arg = argv[cursor] |
|
3346 </xsl:text> |
|
3347 <xsl:text> for (k = 0; k < ph.keys.length; k++) { |
|
3348 </xsl:text> |
|
3349 <xsl:text> if (arg == undefined) { |
|
3350 </xsl:text> |
|
3351 <xsl:text> throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1])) |
|
3352 </xsl:text> |
|
3353 <xsl:text> } |
|
3354 </xsl:text> |
|
3355 <xsl:text> arg = arg[ph.keys[k]] |
|
3356 </xsl:text> |
|
3357 <xsl:text> } |
|
3358 </xsl:text> |
|
3359 <xsl:text> } |
|
3360 </xsl:text> |
|
3361 <xsl:text> else if (ph.param_no) { // positional argument (explicit) |
|
3362 </xsl:text> |
|
3363 <xsl:text> arg = argv[ph.param_no] |
|
3364 </xsl:text> |
|
3365 <xsl:text> } |
|
3366 </xsl:text> |
|
3367 <xsl:text> else { // positional argument (implicit) |
|
3368 </xsl:text> |
|
3369 <xsl:text> arg = argv[cursor++] |
|
3370 </xsl:text> |
|
3371 <xsl:text> } |
|
3372 </xsl:text> |
|
3373 <xsl:text> |
|
3374 </xsl:text> |
|
3375 <xsl:text> if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) { |
|
3376 </xsl:text> |
|
3377 <xsl:text> arg = arg() |
|
3378 </xsl:text> |
|
3379 <xsl:text> } |
|
3380 </xsl:text> |
|
3381 <xsl:text> |
|
3382 </xsl:text> |
|
3383 <xsl:text> if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg))) { |
|
3384 </xsl:text> |
|
3385 <xsl:text> throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg)) |
|
3386 </xsl:text> |
|
3387 <xsl:text> } |
|
3388 </xsl:text> |
|
3389 <xsl:text> |
|
3390 </xsl:text> |
|
3391 <xsl:text> if (re.number.test(ph.type)) { |
|
3392 </xsl:text> |
|
3393 <xsl:text> is_positive = arg >= 0 |
|
3394 </xsl:text> |
|
3395 <xsl:text> } |
|
3396 </xsl:text> |
|
3397 <xsl:text> |
|
3398 </xsl:text> |
|
3399 <xsl:text> switch (ph.type) { |
|
3400 </xsl:text> |
|
3401 <xsl:text> case 'b': |
|
3402 </xsl:text> |
|
3403 <xsl:text> arg = parseInt(arg, 10).toString(2) |
|
3404 </xsl:text> |
|
3405 <xsl:text> break |
|
3406 </xsl:text> |
|
3407 <xsl:text> case 'c': |
|
3408 </xsl:text> |
|
3409 <xsl:text> arg = String.fromCharCode(parseInt(arg, 10)) |
|
3410 </xsl:text> |
|
3411 <xsl:text> break |
|
3412 </xsl:text> |
|
3413 <xsl:text> case 'd': |
|
3414 </xsl:text> |
|
3415 <xsl:text> case 'i': |
|
3416 </xsl:text> |
|
3417 <xsl:text> arg = parseInt(arg, 10) |
|
3418 </xsl:text> |
|
3419 <xsl:text> break |
|
3420 </xsl:text> |
|
3421 <xsl:text> case 'j': |
|
3422 </xsl:text> |
|
3423 <xsl:text> arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0) |
|
3424 </xsl:text> |
|
3425 <xsl:text> break |
|
3426 </xsl:text> |
|
3427 <xsl:text> case 'e': |
|
3428 </xsl:text> |
|
3429 <xsl:text> arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential() |
|
3430 </xsl:text> |
|
3431 <xsl:text> break |
|
3432 </xsl:text> |
|
3433 <xsl:text> case 'f': |
|
3434 </xsl:text> |
|
3435 <xsl:text> arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg) |
|
3436 </xsl:text> |
|
3437 <xsl:text> break |
|
3438 </xsl:text> |
|
3439 <xsl:text> case 'g': |
|
3440 </xsl:text> |
|
3441 <xsl:text> arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg) |
|
3442 </xsl:text> |
|
3443 <xsl:text> break |
|
3444 </xsl:text> |
|
3445 <xsl:text> case 'o': |
|
3446 </xsl:text> |
|
3447 <xsl:text> arg = (parseInt(arg, 10) >>> 0).toString(8) |
|
3448 </xsl:text> |
|
3449 <xsl:text> break |
|
3450 </xsl:text> |
|
3451 <xsl:text> case 's': |
|
3452 </xsl:text> |
|
3453 <xsl:text> arg = String(arg) |
|
3454 </xsl:text> |
|
3455 <xsl:text> arg = (ph.precision ? arg.substring(0, ph.precision) : arg) |
|
3456 </xsl:text> |
|
3457 <xsl:text> break |
|
3458 </xsl:text> |
|
3459 <xsl:text> case 't': |
|
3460 </xsl:text> |
|
3461 <xsl:text> arg = String(!!arg) |
|
3462 </xsl:text> |
|
3463 <xsl:text> arg = (ph.precision ? arg.substring(0, ph.precision) : arg) |
|
3464 </xsl:text> |
|
3465 <xsl:text> break |
|
3466 </xsl:text> |
|
3467 <xsl:text> case 'T': |
|
3468 </xsl:text> |
|
3469 <xsl:text> arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase() |
|
3470 </xsl:text> |
|
3471 <xsl:text> arg = (ph.precision ? arg.substring(0, ph.precision) : arg) |
|
3472 </xsl:text> |
|
3473 <xsl:text> break |
|
3474 </xsl:text> |
|
3475 <xsl:text> case 'u': |
|
3476 </xsl:text> |
|
3477 <xsl:text> arg = parseInt(arg, 10) >>> 0 |
|
3478 </xsl:text> |
|
3479 <xsl:text> break |
|
3480 </xsl:text> |
|
3481 <xsl:text> case 'v': |
|
3482 </xsl:text> |
|
3483 <xsl:text> arg = arg.valueOf() |
|
3484 </xsl:text> |
|
3485 <xsl:text> arg = (ph.precision ? arg.substring(0, ph.precision) : arg) |
|
3486 </xsl:text> |
|
3487 <xsl:text> break |
|
3488 </xsl:text> |
|
3489 <xsl:text> case 'x': |
|
3490 </xsl:text> |
|
3491 <xsl:text> arg = (parseInt(arg, 10) >>> 0).toString(16) |
|
3492 </xsl:text> |
|
3493 <xsl:text> break |
|
3494 </xsl:text> |
|
3495 <xsl:text> case 'X': |
|
3496 </xsl:text> |
|
3497 <xsl:text> arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase() |
|
3498 </xsl:text> |
|
3499 <xsl:text> break |
|
3500 </xsl:text> |
|
3501 <xsl:text> } |
|
3502 </xsl:text> |
|
3503 <xsl:text> if (re.json.test(ph.type)) { |
|
3504 </xsl:text> |
|
3505 <xsl:text> output += arg |
|
3506 </xsl:text> |
|
3507 <xsl:text> } |
|
3508 </xsl:text> |
|
3509 <xsl:text> else { |
|
3510 </xsl:text> |
|
3511 <xsl:text> if (re.number.test(ph.type) && (!is_positive || ph.sign)) { |
|
3512 </xsl:text> |
|
3513 <xsl:text> sign = is_positive ? '+' : '-' |
|
3514 </xsl:text> |
|
3515 <xsl:text> arg = arg.toString().replace(re.sign, '') |
|
3516 </xsl:text> |
|
3517 <xsl:text> } |
|
3518 </xsl:text> |
|
3519 <xsl:text> else { |
|
3520 </xsl:text> |
|
3521 <xsl:text> sign = '' |
|
3522 </xsl:text> |
|
3523 <xsl:text> } |
|
3524 </xsl:text> |
|
3525 <xsl:text> pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' ' |
|
3526 </xsl:text> |
|
3527 <xsl:text> pad_length = ph.width - (sign + arg).length |
|
3528 </xsl:text> |
|
3529 <xsl:text> pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : '' |
|
3530 </xsl:text> |
|
3531 <xsl:text> output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg) |
|
3532 </xsl:text> |
|
3533 <xsl:text> } |
|
3534 </xsl:text> |
|
3535 <xsl:text> } |
|
3536 </xsl:text> |
|
3537 <xsl:text> } |
|
3538 </xsl:text> |
|
3539 <xsl:text> return output |
|
3540 </xsl:text> |
|
3541 <xsl:text> } |
|
3542 </xsl:text> |
|
3543 <xsl:text> |
|
3544 </xsl:text> |
|
3545 <xsl:text> var sprintf_cache = Object.create(null) |
|
3546 </xsl:text> |
|
3547 <xsl:text> |
|
3548 </xsl:text> |
|
3549 <xsl:text> function sprintf_parse(fmt) { |
|
3550 </xsl:text> |
|
3551 <xsl:text> if (sprintf_cache[fmt]) { |
|
3552 </xsl:text> |
|
3553 <xsl:text> return sprintf_cache[fmt] |
|
3554 </xsl:text> |
|
3555 <xsl:text> } |
|
3556 </xsl:text> |
|
3557 <xsl:text> |
|
3558 </xsl:text> |
|
3559 <xsl:text> var _fmt = fmt, match, parse_tree = [], arg_names = 0 |
|
3560 </xsl:text> |
|
3561 <xsl:text> while (_fmt) { |
|
3562 </xsl:text> |
|
3563 <xsl:text> if ((match = re.text.exec(_fmt)) !== null) { |
|
3564 </xsl:text> |
|
3565 <xsl:text> parse_tree.push(match[0]) |
|
3566 </xsl:text> |
|
3567 <xsl:text> } |
|
3568 </xsl:text> |
|
3569 <xsl:text> else if ((match = re.modulo.exec(_fmt)) !== null) { |
|
3570 </xsl:text> |
|
3571 <xsl:text> parse_tree.push('%') |
|
3572 </xsl:text> |
|
3573 <xsl:text> } |
|
3574 </xsl:text> |
|
3575 <xsl:text> else if ((match = re.placeholder.exec(_fmt)) !== null) { |
|
3576 </xsl:text> |
|
3577 <xsl:text> if (match[2]) { |
|
3578 </xsl:text> |
|
3579 <xsl:text> arg_names |= 1 |
|
3580 </xsl:text> |
|
3581 <xsl:text> var field_list = [], replacement_field = match[2], field_match = [] |
|
3582 </xsl:text> |
|
3583 <xsl:text> if ((field_match = re.key.exec(replacement_field)) !== null) { |
|
3584 </xsl:text> |
|
3585 <xsl:text> field_list.push(field_match[1]) |
|
3586 </xsl:text> |
|
3587 <xsl:text> while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { |
|
3588 </xsl:text> |
|
3589 <xsl:text> if ((field_match = re.key_access.exec(replacement_field)) !== null) { |
|
3590 </xsl:text> |
|
3591 <xsl:text> field_list.push(field_match[1]) |
|
3592 </xsl:text> |
|
3593 <xsl:text> } |
|
3594 </xsl:text> |
|
3595 <xsl:text> else if ((field_match = re.index_access.exec(replacement_field)) !== null) { |
|
3596 </xsl:text> |
|
3597 <xsl:text> field_list.push(field_match[1]) |
|
3598 </xsl:text> |
|
3599 <xsl:text> } |
|
3600 </xsl:text> |
|
3601 <xsl:text> else { |
|
3602 </xsl:text> |
|
3603 <xsl:text> throw new SyntaxError('[sprintf] failed to parse named argument key') |
|
3604 </xsl:text> |
|
3605 <xsl:text> } |
|
3606 </xsl:text> |
|
3607 <xsl:text> } |
|
3608 </xsl:text> |
|
3609 <xsl:text> } |
|
3610 </xsl:text> |
|
3611 <xsl:text> else { |
|
3612 </xsl:text> |
|
3613 <xsl:text> throw new SyntaxError('[sprintf] failed to parse named argument key') |
|
3614 </xsl:text> |
|
3615 <xsl:text> } |
|
3616 </xsl:text> |
|
3617 <xsl:text> match[2] = field_list |
|
3618 </xsl:text> |
|
3619 <xsl:text> } |
|
3620 </xsl:text> |
|
3621 <xsl:text> else { |
|
3622 </xsl:text> |
|
3623 <xsl:text> arg_names |= 2 |
|
3624 </xsl:text> |
|
3625 <xsl:text> } |
|
3626 </xsl:text> |
|
3627 <xsl:text> if (arg_names === 3) { |
|
3628 </xsl:text> |
|
3629 <xsl:text> throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported') |
|
3630 </xsl:text> |
|
3631 <xsl:text> } |
|
3632 </xsl:text> |
|
3633 <xsl:text> |
|
3634 </xsl:text> |
|
3635 <xsl:text> parse_tree.push( |
|
3636 </xsl:text> |
|
3637 <xsl:text> { |
|
3638 </xsl:text> |
|
3639 <xsl:text> placeholder: match[0], |
|
3640 </xsl:text> |
|
3641 <xsl:text> param_no: match[1], |
|
3642 </xsl:text> |
|
3643 <xsl:text> keys: match[2], |
|
3644 </xsl:text> |
|
3645 <xsl:text> sign: match[3], |
|
3646 </xsl:text> |
|
3647 <xsl:text> pad_char: match[4], |
|
3648 </xsl:text> |
|
3649 <xsl:text> align: match[5], |
|
3650 </xsl:text> |
|
3651 <xsl:text> width: match[6], |
|
3652 </xsl:text> |
|
3653 <xsl:text> precision: match[7], |
|
3654 </xsl:text> |
|
3655 <xsl:text> type: match[8] |
|
3656 </xsl:text> |
|
3657 <xsl:text> } |
|
3658 </xsl:text> |
|
3659 <xsl:text> ) |
|
3660 </xsl:text> |
|
3661 <xsl:text> } |
|
3662 </xsl:text> |
|
3663 <xsl:text> else { |
|
3664 </xsl:text> |
|
3665 <xsl:text> throw new SyntaxError('[sprintf] unexpected placeholder') |
|
3666 </xsl:text> |
|
3667 <xsl:text> } |
|
3668 </xsl:text> |
|
3669 <xsl:text> _fmt = _fmt.substring(match[0].length) |
|
3670 </xsl:text> |
|
3671 <xsl:text> } |
|
3672 </xsl:text> |
|
3673 <xsl:text> return sprintf_cache[fmt] = parse_tree |
|
3674 </xsl:text> |
|
3675 <xsl:text> } |
|
3676 </xsl:text> |
|
3677 <xsl:text> |
|
3678 </xsl:text> |
|
3679 <xsl:text> /** |
|
3680 </xsl:text> |
|
3681 <xsl:text> * export to either browser or node.js |
|
3682 </xsl:text> |
|
3683 <xsl:text> */ |
|
3684 </xsl:text> |
|
3685 <xsl:text> /* eslint-disable quote-props */ |
|
3686 </xsl:text> |
|
3687 <xsl:text> if (typeof exports !== 'undefined') { |
|
3688 </xsl:text> |
|
3689 <xsl:text> exports['sprintf'] = sprintf |
|
3690 </xsl:text> |
|
3691 <xsl:text> exports['vsprintf'] = vsprintf |
|
3692 </xsl:text> |
|
3693 <xsl:text> } |
|
3694 </xsl:text> |
|
3695 <xsl:text> if (typeof window !== 'undefined') { |
|
3696 </xsl:text> |
|
3697 <xsl:text> window['sprintf'] = sprintf |
|
3698 </xsl:text> |
|
3699 <xsl:text> window['vsprintf'] = vsprintf |
|
3700 </xsl:text> |
|
3701 <xsl:text> |
|
3702 </xsl:text> |
|
3703 <xsl:text> if (typeof define === 'function' && define['amd']) { |
|
3704 </xsl:text> |
|
3705 <xsl:text> define(function() { |
|
3706 </xsl:text> |
|
3707 <xsl:text> return { |
|
3708 </xsl:text> |
|
3709 <xsl:text> 'sprintf': sprintf, |
|
3710 </xsl:text> |
|
3711 <xsl:text> 'vsprintf': vsprintf |
|
3712 </xsl:text> |
|
3713 <xsl:text> } |
|
3714 </xsl:text> |
|
3715 <xsl:text> }) |
|
3716 </xsl:text> |
|
3717 <xsl:text> } |
|
3718 </xsl:text> |
|
3719 <xsl:text> } |
|
3720 </xsl:text> |
|
3721 <xsl:text> /* eslint-enable quote-props */ |
|
3722 </xsl:text> |
|
3723 <xsl:text>}(); // eslint-disable-line |
|
3724 </xsl:text> |
|
3725 <xsl:text> |
|
3726 </xsl:text> |
|
3727 </xsl:template> |
3258 </xsl:template> |
3728 <xsl:template match="widget[@type='DropDown']" mode="widget_desc"> |
3259 <xsl:template match="widget[@type='DropDown']" mode="widget_desc"> |
3729 <type> |
3260 <type> |
3730 <xsl:value-of select="@type"/> |
3261 <xsl:value-of select="@type"/> |
3731 </type> |
3262 </type> |
7988 // Statements that needs to be at the end |
7515 // Statements that needs to be at the end |
7989 // |
7516 // |
7990 // |
7517 // |
7991 </xsl:text> |
7518 </xsl:text> |
7992 <xsl:apply-templates select="document('')/*/epilogue:*"/> |
7519 <xsl:apply-templates select="document('')/*/epilogue:*"/> |
|
7520 <xsl:text>/* https://github.com/alexei/sprintf.js/blob/master/src/sprintf.js */ |
|
7521 </xsl:text> |
|
7522 <xsl:text>/* global window, exports, define */ |
|
7523 </xsl:text> |
|
7524 <xsl:text> |
|
7525 </xsl:text> |
|
7526 <xsl:text>!function() { |
|
7527 </xsl:text> |
|
7528 <xsl:text> 'use strict' |
|
7529 </xsl:text> |
|
7530 <xsl:text> |
|
7531 </xsl:text> |
|
7532 <xsl:text> var re = { |
|
7533 </xsl:text> |
|
7534 <xsl:text> not_string: /[^s]/, |
|
7535 </xsl:text> |
|
7536 <xsl:text> not_bool: /[^t]/, |
|
7537 </xsl:text> |
|
7538 <xsl:text> not_type: /[^T]/, |
|
7539 </xsl:text> |
|
7540 <xsl:text> not_primitive: /[^v]/, |
|
7541 </xsl:text> |
|
7542 <xsl:text> number: /[diefg]/, |
|
7543 </xsl:text> |
|
7544 <xsl:text> numeric_arg: /[bcdiefguxX]/, |
|
7545 </xsl:text> |
|
7546 <xsl:text> json: /[j]/, |
|
7547 </xsl:text> |
|
7548 <xsl:text> not_json: /[^j]/, |
|
7549 </xsl:text> |
|
7550 <xsl:text> text: /^[^%]+/, |
|
7551 </xsl:text> |
|
7552 <xsl:text> modulo: /^%{2}/, |
|
7553 </xsl:text> |
|
7554 <xsl:text> placeholder: /^%(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, |
|
7555 </xsl:text> |
|
7556 <xsl:text> key: /^([a-z_][a-z_\d]*)/i, |
|
7557 </xsl:text> |
|
7558 <xsl:text> key_access: /^\.([a-z_][a-z_\d]*)/i, |
|
7559 </xsl:text> |
|
7560 <xsl:text> index_access: /^\[(\d+)\]/, |
|
7561 </xsl:text> |
|
7562 <xsl:text> sign: /^[+-]/ |
|
7563 </xsl:text> |
|
7564 <xsl:text> } |
|
7565 </xsl:text> |
|
7566 <xsl:text> |
|
7567 </xsl:text> |
|
7568 <xsl:text> function sprintf(key) { |
|
7569 </xsl:text> |
|
7570 <xsl:text> // arguments is not an array, but should be fine for this call |
|
7571 </xsl:text> |
|
7572 <xsl:text> return sprintf_format(sprintf_parse(key), arguments) |
|
7573 </xsl:text> |
|
7574 <xsl:text> } |
|
7575 </xsl:text> |
|
7576 <xsl:text> |
|
7577 </xsl:text> |
|
7578 <xsl:text> function vsprintf(fmt, argv) { |
|
7579 </xsl:text> |
|
7580 <xsl:text> return sprintf.apply(null, [fmt].concat(argv || [])) |
|
7581 </xsl:text> |
|
7582 <xsl:text> } |
|
7583 </xsl:text> |
|
7584 <xsl:text> |
|
7585 </xsl:text> |
|
7586 <xsl:text> function sprintf_format(parse_tree, argv) { |
|
7587 </xsl:text> |
|
7588 <xsl:text> var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign |
|
7589 </xsl:text> |
|
7590 <xsl:text> for (i = 0; i < tree_length; i++) { |
|
7591 </xsl:text> |
|
7592 <xsl:text> if (typeof parse_tree[i] === 'string') { |
|
7593 </xsl:text> |
|
7594 <xsl:text> output += parse_tree[i] |
|
7595 </xsl:text> |
|
7596 <xsl:text> } |
|
7597 </xsl:text> |
|
7598 <xsl:text> else if (typeof parse_tree[i] === 'object') { |
|
7599 </xsl:text> |
|
7600 <xsl:text> ph = parse_tree[i] // convenience purposes only |
|
7601 </xsl:text> |
|
7602 <xsl:text> if (ph.keys) { // keyword argument |
|
7603 </xsl:text> |
|
7604 <xsl:text> arg = argv[cursor] |
|
7605 </xsl:text> |
|
7606 <xsl:text> for (k = 0; k < ph.keys.length; k++) { |
|
7607 </xsl:text> |
|
7608 <xsl:text> if (arg == undefined) { |
|
7609 </xsl:text> |
|
7610 <xsl:text> throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1])) |
|
7611 </xsl:text> |
|
7612 <xsl:text> } |
|
7613 </xsl:text> |
|
7614 <xsl:text> arg = arg[ph.keys[k]] |
|
7615 </xsl:text> |
|
7616 <xsl:text> } |
|
7617 </xsl:text> |
|
7618 <xsl:text> } |
|
7619 </xsl:text> |
|
7620 <xsl:text> else if (ph.param_no) { // positional argument (explicit) |
|
7621 </xsl:text> |
|
7622 <xsl:text> arg = argv[ph.param_no] |
|
7623 </xsl:text> |
|
7624 <xsl:text> } |
|
7625 </xsl:text> |
|
7626 <xsl:text> else { // positional argument (implicit) |
|
7627 </xsl:text> |
|
7628 <xsl:text> arg = argv[cursor++] |
|
7629 </xsl:text> |
|
7630 <xsl:text> } |
|
7631 </xsl:text> |
|
7632 <xsl:text> |
|
7633 </xsl:text> |
|
7634 <xsl:text> if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) { |
|
7635 </xsl:text> |
|
7636 <xsl:text> arg = arg() |
|
7637 </xsl:text> |
|
7638 <xsl:text> } |
|
7639 </xsl:text> |
|
7640 <xsl:text> |
|
7641 </xsl:text> |
|
7642 <xsl:text> if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg))) { |
|
7643 </xsl:text> |
|
7644 <xsl:text> throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg)) |
|
7645 </xsl:text> |
|
7646 <xsl:text> } |
|
7647 </xsl:text> |
|
7648 <xsl:text> |
|
7649 </xsl:text> |
|
7650 <xsl:text> if (re.number.test(ph.type)) { |
|
7651 </xsl:text> |
|
7652 <xsl:text> is_positive = arg >= 0 |
|
7653 </xsl:text> |
|
7654 <xsl:text> } |
|
7655 </xsl:text> |
|
7656 <xsl:text> |
|
7657 </xsl:text> |
|
7658 <xsl:text> switch (ph.type) { |
|
7659 </xsl:text> |
|
7660 <xsl:text> case 'b': |
|
7661 </xsl:text> |
|
7662 <xsl:text> arg = parseInt(arg, 10).toString(2) |
|
7663 </xsl:text> |
|
7664 <xsl:text> break |
|
7665 </xsl:text> |
|
7666 <xsl:text> case 'c': |
|
7667 </xsl:text> |
|
7668 <xsl:text> arg = String.fromCharCode(parseInt(arg, 10)) |
|
7669 </xsl:text> |
|
7670 <xsl:text> break |
|
7671 </xsl:text> |
|
7672 <xsl:text> case 'd': |
|
7673 </xsl:text> |
|
7674 <xsl:text> case 'i': |
|
7675 </xsl:text> |
|
7676 <xsl:text> arg = parseInt(arg, 10) |
|
7677 </xsl:text> |
|
7678 <xsl:text> break |
|
7679 </xsl:text> |
|
7680 <xsl:text> case 'j': |
|
7681 </xsl:text> |
|
7682 <xsl:text> arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0) |
|
7683 </xsl:text> |
|
7684 <xsl:text> break |
|
7685 </xsl:text> |
|
7686 <xsl:text> case 'e': |
|
7687 </xsl:text> |
|
7688 <xsl:text> arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential() |
|
7689 </xsl:text> |
|
7690 <xsl:text> break |
|
7691 </xsl:text> |
|
7692 <xsl:text> case 'f': |
|
7693 </xsl:text> |
|
7694 <xsl:text> arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg) |
|
7695 </xsl:text> |
|
7696 <xsl:text> break |
|
7697 </xsl:text> |
|
7698 <xsl:text> case 'g': |
|
7699 </xsl:text> |
|
7700 <xsl:text> arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg) |
|
7701 </xsl:text> |
|
7702 <xsl:text> break |
|
7703 </xsl:text> |
|
7704 <xsl:text> case 'o': |
|
7705 </xsl:text> |
|
7706 <xsl:text> arg = (parseInt(arg, 10) >>> 0).toString(8) |
|
7707 </xsl:text> |
|
7708 <xsl:text> break |
|
7709 </xsl:text> |
|
7710 <xsl:text> case 's': |
|
7711 </xsl:text> |
|
7712 <xsl:text> arg = String(arg) |
|
7713 </xsl:text> |
|
7714 <xsl:text> arg = (ph.precision ? arg.substring(0, ph.precision) : arg) |
|
7715 </xsl:text> |
|
7716 <xsl:text> break |
|
7717 </xsl:text> |
|
7718 <xsl:text> case 't': |
|
7719 </xsl:text> |
|
7720 <xsl:text> arg = String(!!arg) |
|
7721 </xsl:text> |
|
7722 <xsl:text> arg = (ph.precision ? arg.substring(0, ph.precision) : arg) |
|
7723 </xsl:text> |
|
7724 <xsl:text> break |
|
7725 </xsl:text> |
|
7726 <xsl:text> case 'T': |
|
7727 </xsl:text> |
|
7728 <xsl:text> arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase() |
|
7729 </xsl:text> |
|
7730 <xsl:text> arg = (ph.precision ? arg.substring(0, ph.precision) : arg) |
|
7731 </xsl:text> |
|
7732 <xsl:text> break |
|
7733 </xsl:text> |
|
7734 <xsl:text> case 'u': |
|
7735 </xsl:text> |
|
7736 <xsl:text> arg = parseInt(arg, 10) >>> 0 |
|
7737 </xsl:text> |
|
7738 <xsl:text> break |
|
7739 </xsl:text> |
|
7740 <xsl:text> case 'v': |
|
7741 </xsl:text> |
|
7742 <xsl:text> arg = arg.valueOf() |
|
7743 </xsl:text> |
|
7744 <xsl:text> arg = (ph.precision ? arg.substring(0, ph.precision) : arg) |
|
7745 </xsl:text> |
|
7746 <xsl:text> break |
|
7747 </xsl:text> |
|
7748 <xsl:text> case 'x': |
|
7749 </xsl:text> |
|
7750 <xsl:text> arg = (parseInt(arg, 10) >>> 0).toString(16) |
|
7751 </xsl:text> |
|
7752 <xsl:text> break |
|
7753 </xsl:text> |
|
7754 <xsl:text> case 'X': |
|
7755 </xsl:text> |
|
7756 <xsl:text> arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase() |
|
7757 </xsl:text> |
|
7758 <xsl:text> break |
|
7759 </xsl:text> |
|
7760 <xsl:text> } |
|
7761 </xsl:text> |
|
7762 <xsl:text> if (re.json.test(ph.type)) { |
|
7763 </xsl:text> |
|
7764 <xsl:text> output += arg |
|
7765 </xsl:text> |
|
7766 <xsl:text> } |
|
7767 </xsl:text> |
|
7768 <xsl:text> else { |
|
7769 </xsl:text> |
|
7770 <xsl:text> if (re.number.test(ph.type) && (!is_positive || ph.sign)) { |
|
7771 </xsl:text> |
|
7772 <xsl:text> sign = is_positive ? '+' : '-' |
|
7773 </xsl:text> |
|
7774 <xsl:text> arg = arg.toString().replace(re.sign, '') |
|
7775 </xsl:text> |
|
7776 <xsl:text> } |
|
7777 </xsl:text> |
|
7778 <xsl:text> else { |
|
7779 </xsl:text> |
|
7780 <xsl:text> sign = '' |
|
7781 </xsl:text> |
|
7782 <xsl:text> } |
|
7783 </xsl:text> |
|
7784 <xsl:text> pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' ' |
|
7785 </xsl:text> |
|
7786 <xsl:text> pad_length = ph.width - (sign + arg).length |
|
7787 </xsl:text> |
|
7788 <xsl:text> pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : '' |
|
7789 </xsl:text> |
|
7790 <xsl:text> output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg) |
|
7791 </xsl:text> |
|
7792 <xsl:text> } |
|
7793 </xsl:text> |
|
7794 <xsl:text> } |
|
7795 </xsl:text> |
|
7796 <xsl:text> } |
|
7797 </xsl:text> |
|
7798 <xsl:text> return output |
|
7799 </xsl:text> |
|
7800 <xsl:text> } |
|
7801 </xsl:text> |
|
7802 <xsl:text> |
|
7803 </xsl:text> |
|
7804 <xsl:text> var sprintf_cache = Object.create(null) |
|
7805 </xsl:text> |
|
7806 <xsl:text> |
|
7807 </xsl:text> |
|
7808 <xsl:text> function sprintf_parse(fmt) { |
|
7809 </xsl:text> |
|
7810 <xsl:text> if (sprintf_cache[fmt]) { |
|
7811 </xsl:text> |
|
7812 <xsl:text> return sprintf_cache[fmt] |
|
7813 </xsl:text> |
|
7814 <xsl:text> } |
|
7815 </xsl:text> |
|
7816 <xsl:text> |
|
7817 </xsl:text> |
|
7818 <xsl:text> var _fmt = fmt, match, parse_tree = [], arg_names = 0 |
|
7819 </xsl:text> |
|
7820 <xsl:text> while (_fmt) { |
|
7821 </xsl:text> |
|
7822 <xsl:text> if ((match = re.text.exec(_fmt)) !== null) { |
|
7823 </xsl:text> |
|
7824 <xsl:text> parse_tree.push(match[0]) |
|
7825 </xsl:text> |
|
7826 <xsl:text> } |
|
7827 </xsl:text> |
|
7828 <xsl:text> else if ((match = re.modulo.exec(_fmt)) !== null) { |
|
7829 </xsl:text> |
|
7830 <xsl:text> parse_tree.push('%') |
|
7831 </xsl:text> |
|
7832 <xsl:text> } |
|
7833 </xsl:text> |
|
7834 <xsl:text> else if ((match = re.placeholder.exec(_fmt)) !== null) { |
|
7835 </xsl:text> |
|
7836 <xsl:text> if (match[2]) { |
|
7837 </xsl:text> |
|
7838 <xsl:text> arg_names |= 1 |
|
7839 </xsl:text> |
|
7840 <xsl:text> var field_list = [], replacement_field = match[2], field_match = [] |
|
7841 </xsl:text> |
|
7842 <xsl:text> if ((field_match = re.key.exec(replacement_field)) !== null) { |
|
7843 </xsl:text> |
|
7844 <xsl:text> field_list.push(field_match[1]) |
|
7845 </xsl:text> |
|
7846 <xsl:text> while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { |
|
7847 </xsl:text> |
|
7848 <xsl:text> if ((field_match = re.key_access.exec(replacement_field)) !== null) { |
|
7849 </xsl:text> |
|
7850 <xsl:text> field_list.push(field_match[1]) |
|
7851 </xsl:text> |
|
7852 <xsl:text> } |
|
7853 </xsl:text> |
|
7854 <xsl:text> else if ((field_match = re.index_access.exec(replacement_field)) !== null) { |
|
7855 </xsl:text> |
|
7856 <xsl:text> field_list.push(field_match[1]) |
|
7857 </xsl:text> |
|
7858 <xsl:text> } |
|
7859 </xsl:text> |
|
7860 <xsl:text> else { |
|
7861 </xsl:text> |
|
7862 <xsl:text> throw new SyntaxError('[sprintf] failed to parse named argument key') |
|
7863 </xsl:text> |
|
7864 <xsl:text> } |
|
7865 </xsl:text> |
|
7866 <xsl:text> } |
|
7867 </xsl:text> |
|
7868 <xsl:text> } |
|
7869 </xsl:text> |
|
7870 <xsl:text> else { |
|
7871 </xsl:text> |
|
7872 <xsl:text> throw new SyntaxError('[sprintf] failed to parse named argument key') |
|
7873 </xsl:text> |
|
7874 <xsl:text> } |
|
7875 </xsl:text> |
|
7876 <xsl:text> match[2] = field_list |
|
7877 </xsl:text> |
|
7878 <xsl:text> } |
|
7879 </xsl:text> |
|
7880 <xsl:text> else { |
|
7881 </xsl:text> |
|
7882 <xsl:text> arg_names |= 2 |
|
7883 </xsl:text> |
|
7884 <xsl:text> } |
|
7885 </xsl:text> |
|
7886 <xsl:text> if (arg_names === 3) { |
|
7887 </xsl:text> |
|
7888 <xsl:text> throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported') |
|
7889 </xsl:text> |
|
7890 <xsl:text> } |
|
7891 </xsl:text> |
|
7892 <xsl:text> |
|
7893 </xsl:text> |
|
7894 <xsl:text> parse_tree.push( |
|
7895 </xsl:text> |
|
7896 <xsl:text> { |
|
7897 </xsl:text> |
|
7898 <xsl:text> placeholder: match[0], |
|
7899 </xsl:text> |
|
7900 <xsl:text> param_no: match[1], |
|
7901 </xsl:text> |
|
7902 <xsl:text> keys: match[2], |
|
7903 </xsl:text> |
|
7904 <xsl:text> sign: match[3], |
|
7905 </xsl:text> |
|
7906 <xsl:text> pad_char: match[4], |
|
7907 </xsl:text> |
|
7908 <xsl:text> align: match[5], |
|
7909 </xsl:text> |
|
7910 <xsl:text> width: match[6], |
|
7911 </xsl:text> |
|
7912 <xsl:text> precision: match[7], |
|
7913 </xsl:text> |
|
7914 <xsl:text> type: match[8] |
|
7915 </xsl:text> |
|
7916 <xsl:text> } |
|
7917 </xsl:text> |
|
7918 <xsl:text> ) |
|
7919 </xsl:text> |
|
7920 <xsl:text> } |
|
7921 </xsl:text> |
|
7922 <xsl:text> else { |
|
7923 </xsl:text> |
|
7924 <xsl:text> throw new SyntaxError('[sprintf] unexpected placeholder') |
|
7925 </xsl:text> |
|
7926 <xsl:text> } |
|
7927 </xsl:text> |
|
7928 <xsl:text> _fmt = _fmt.substring(match[0].length) |
|
7929 </xsl:text> |
|
7930 <xsl:text> } |
|
7931 </xsl:text> |
|
7932 <xsl:text> return sprintf_cache[fmt] = parse_tree |
|
7933 </xsl:text> |
|
7934 <xsl:text> } |
|
7935 </xsl:text> |
|
7936 <xsl:text> |
|
7937 </xsl:text> |
|
7938 <xsl:text> /** |
|
7939 </xsl:text> |
|
7940 <xsl:text> * export to either browser or node.js |
|
7941 </xsl:text> |
|
7942 <xsl:text> */ |
|
7943 </xsl:text> |
|
7944 <xsl:text> /* eslint-disable quote-props */ |
|
7945 </xsl:text> |
|
7946 <xsl:text> if (typeof exports !== 'undefined') { |
|
7947 </xsl:text> |
|
7948 <xsl:text> exports['sprintf'] = sprintf |
|
7949 </xsl:text> |
|
7950 <xsl:text> exports['vsprintf'] = vsprintf |
|
7951 </xsl:text> |
|
7952 <xsl:text> } |
|
7953 </xsl:text> |
|
7954 <xsl:text> if (typeof window !== 'undefined') { |
|
7955 </xsl:text> |
|
7956 <xsl:text> window['sprintf'] = sprintf |
|
7957 </xsl:text> |
|
7958 <xsl:text> window['vsprintf'] = vsprintf |
|
7959 </xsl:text> |
|
7960 <xsl:text> |
|
7961 </xsl:text> |
|
7962 <xsl:text> if (typeof define === 'function' && define['amd']) { |
|
7963 </xsl:text> |
|
7964 <xsl:text> define(function() { |
|
7965 </xsl:text> |
|
7966 <xsl:text> return { |
|
7967 </xsl:text> |
|
7968 <xsl:text> 'sprintf': sprintf, |
|
7969 </xsl:text> |
|
7970 <xsl:text> 'vsprintf': vsprintf |
|
7971 </xsl:text> |
|
7972 <xsl:text> } |
|
7973 </xsl:text> |
|
7974 <xsl:text> }) |
|
7975 </xsl:text> |
|
7976 <xsl:text> } |
|
7977 </xsl:text> |
|
7978 <xsl:text> } |
|
7979 </xsl:text> |
|
7980 <xsl:text> /* eslint-enable quote-props */ |
|
7981 </xsl:text> |
|
7982 <xsl:text>}(); // eslint-disable-line |
|
7983 </xsl:text> |
7993 <xsl:text>// svghmi.js |
7984 <xsl:text>// svghmi.js |
7994 </xsl:text> |
7985 </xsl:text> |
7995 <xsl:text> |
7986 <xsl:text> |
7996 </xsl:text> |
7987 </xsl:text> |
7997 <xsl:text>var need_cache_apply = []; |
7988 <xsl:text>var need_cache_apply = []; |