docs: function (substring, valueIndex, flags, minWidth, precision, type) {
          var number, prefix, method, textTransform, value
  
          if (substring === '%%') {
            return '%'
          }
  
          // parse flags
          var leftJustify = false
          var positivePrefix = ''
          var zeroPad = false
          var prefixBaseX = false
          var customPadChar = ' '
          var flagsl = flags.length
          var j
          for (j = 0; j < flagsl; j++) {
            switch (flags.charAt(j)) {
              case ' ':
                positivePrefix = ' '
                break
              case '+':
                positivePrefix = '+'
                break
              case '-':
                leftJustify = true
                break
              case "'":
                customPadChar = flags.charAt(j + 1)
                break
              case '0':
                zeroPad = true
                customPadChar = '0'
                break
              case '#':
                prefixBaseX = true
                break
            }
          }
  
          // parameters may be null, undefined, empty-string or real valued
          // we want to ignore null, undefined and empty-string values
          if (!minWidth) {
            minWidth = 0
          } else if (minWidth === '*') {
            minWidth = +a[i++]
          } else if (minWidth.charAt(0) === '*') {
            minWidth = +a[minWidth.slice(1, -1)]
          } else {
            minWidth = +minWidth
          }
  
          // Note: undocumented perl feature:
          if (minWidth < 0) {
            minWidth = -minWidth
            leftJustify = true
          }
  
          if (!isFinite(minWidth)) {
            throw new Error('sprintf: (minimum-)width must be finite')
          }
  
          if (!precision) {
            precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type === 'd') ? 0 : undefined
          } else if (precision === '*') {
            precision = +a[i++]
          } else if (precision.charAt(0) === '*') {
            precision = +a[precision.slice(1, -1)]
          } else {
            precision = +precision
          }
  
          // grab value using valueIndex if required?
          value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++]
  
          switch (type) {
            case 's':
              return _formatString(value + '', leftJustify, minWidth, precision, zeroPad, customPadChar)
            case 'c':
              return _formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad)
            case 'b':
              return _formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
            case 'o':
              return _formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
            case 'x':
              return _formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
            case 'X':
              return _formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase()
            case 'u':
              return _formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad)
            case 'i':
            case 'd':
              number = +value || 0
              // Plain Math.round doesn't just truncate
              number = Math.round(number - number % 1)
              prefix = number < 0 ? '-' : positivePrefix
              value = prefix + _pad(String(Math.abs(number)), precision, '0', false)
              return justify(value, prefix, leftJustify, minWidth, zeroPad)
            case 'e':
            case 'E':
            case 'f': // @todo: Should handle locales (as per setlocale)
            case 'F':
            case 'g':
            case 'G':
              number = +value
              prefix = number < 0 ? '-' : positivePrefix
              method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())]
              textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2]
              value = prefix + Math.abs(number)[method](precision)
              return phpJs.justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]()
            default:
              return substring
          }
        }