code-indented.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. 'use strict'
  2. var repeat = require('repeat-string')
  3. var trim = require('trim-trailing-lines')
  4. module.exports = indentedCode
  5. var lineFeed = '\n'
  6. var tab = '\t'
  7. var space = ' '
  8. var tabSize = 4
  9. var codeIndent = repeat(space, tabSize)
  10. function indentedCode(eat, value, silent) {
  11. var index = -1
  12. var length = value.length
  13. var subvalue = ''
  14. var content = ''
  15. var subvalueQueue = ''
  16. var contentQueue = ''
  17. var character
  18. var blankQueue
  19. var indent
  20. while (++index < length) {
  21. character = value.charAt(index)
  22. if (indent) {
  23. indent = false
  24. subvalue += subvalueQueue
  25. content += contentQueue
  26. subvalueQueue = ''
  27. contentQueue = ''
  28. if (character === lineFeed) {
  29. subvalueQueue = character
  30. contentQueue = character
  31. } else {
  32. subvalue += character
  33. content += character
  34. while (++index < length) {
  35. character = value.charAt(index)
  36. if (!character || character === lineFeed) {
  37. contentQueue = character
  38. subvalueQueue = character
  39. break
  40. }
  41. subvalue += character
  42. content += character
  43. }
  44. }
  45. } else if (
  46. character === space &&
  47. value.charAt(index + 1) === character &&
  48. value.charAt(index + 2) === character &&
  49. value.charAt(index + 3) === character
  50. ) {
  51. subvalueQueue += codeIndent
  52. index += 3
  53. indent = true
  54. } else if (character === tab) {
  55. subvalueQueue += character
  56. indent = true
  57. } else {
  58. blankQueue = ''
  59. while (character === tab || character === space) {
  60. blankQueue += character
  61. character = value.charAt(++index)
  62. }
  63. if (character !== lineFeed) {
  64. break
  65. }
  66. subvalueQueue += blankQueue + character
  67. contentQueue += character
  68. }
  69. }
  70. if (content) {
  71. if (silent) {
  72. return true
  73. }
  74. return eat(subvalue)({
  75. type: 'code',
  76. lang: null,
  77. meta: null,
  78. value: trim(content)
  79. })
  80. }
  81. }