index.js 970 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. 'use strict'
  2. module.exports = detab
  3. var repeat = require('repeat-string')
  4. var tab = 0x09
  5. var lineFeed = 0x0a
  6. var carriageReturn = 0x0d
  7. // Replace tabs with spaces, being smart about which column the tab is at and
  8. // which size should be used.
  9. function detab(value, size) {
  10. var string = typeof value === 'string'
  11. var length = string && value.length
  12. var start = 0
  13. var index = -1
  14. var column = -1
  15. var tabSize = size || 4
  16. var results = []
  17. var code
  18. var add
  19. if (!string) {
  20. throw new Error('detab expected string')
  21. }
  22. while (++index < length) {
  23. code = value.charCodeAt(index)
  24. if (code === tab) {
  25. add = tabSize - ((column + 1) % tabSize)
  26. column += add
  27. results.push(value.slice(start, index) + repeat(' ', add))
  28. start = index + 1
  29. } else if (code === lineFeed || code === carriageReturn) {
  30. column = -1
  31. } else {
  32. column++
  33. }
  34. }
  35. results.push(value.slice(start))
  36. return results.join('')
  37. }