PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/gems/coderay-0.9.7/lib/coderay/scanners/yaml.rb

https://gitlab.com/ba0f3/redmine
Ruby | 140 lines | 123 code | 13 blank | 4 comment | 23 complexity | f62eab25adbef42e92cad3f5463f91ac MD5 | raw file
  1. module CodeRay
  2. module Scanners
  3. # YAML Scanner
  4. #
  5. # Based on the YAML scanner from Syntax by Jamis Buck.
  6. class YAML < Scanner
  7. register_for :yaml
  8. file_extension 'yml'
  9. KINDS_NOT_LOC = :all
  10. def scan_tokens tokens, options
  11. value_expected = nil
  12. state = :initial
  13. key_indent = indent = 0
  14. until eos?
  15. kind = nil
  16. match = nil
  17. key_indent = nil if bol?
  18. if match = scan(/ +[\t ]*/)
  19. kind = :space
  20. elsif match = scan(/\n+/)
  21. kind = :space
  22. state = :initial if match.index(?\n)
  23. elsif match = scan(/#.*/)
  24. kind = :comment
  25. elsif bol? and case
  26. when match = scan(/---|\.\.\./)
  27. tokens << [:open, :head]
  28. tokens << [match, :head]
  29. tokens << [:close, :head]
  30. next
  31. when match = scan(/%.*/)
  32. tokens << [match, :doctype]
  33. next
  34. end
  35. elsif state == :value and case
  36. when !check(/(?:"[^"]*")(?=: |:$)/) && scan(/"/)
  37. tokens << [:open, :string]
  38. tokens << [matched, :delimiter]
  39. tokens << [matched, :content] if scan(/ [^"\\]* (?: \\. [^"\\]* )* /mx)
  40. tokens << [matched, :delimiter] if scan(/"/)
  41. tokens << [:close, :string]
  42. next
  43. when match = scan(/[|>][-+]?/)
  44. tokens << [:open, :string]
  45. tokens << [match, :delimiter]
  46. string_indent = key_indent || column(pos - match.size - 1)
  47. tokens << [matched, :content] if scan(/(?:\n+ {#{string_indent + 1}}.*)+/)
  48. tokens << [:close, :string]
  49. next
  50. when match = scan(/(?![!"*&]).+?(?=$|\s+#)/)
  51. tokens << [match, :string]
  52. string_indent = key_indent || column(pos - match.size - 1)
  53. tokens << [matched, :string] if scan(/(?:\n+ {#{string_indent + 1}}.*)+/)
  54. next
  55. end
  56. elsif case
  57. when match = scan(/[-:](?= |$)/)
  58. state = :value if state == :colon && (match == ':' || match == '-')
  59. state = :value if state == :initial && match == '-'
  60. kind = :operator
  61. when match = scan(/[,{}\[\]]/)
  62. kind = :operator
  63. when state == :initial && match = scan(/[\w.() ]*\S(?=: |:$)/)
  64. kind = :key
  65. key_indent = column(pos - match.size - 1)
  66. # tokens << [key_indent.inspect, :debug]
  67. state = :colon
  68. when match = scan(/(?:"[^"\n]*"|'[^'\n]*')(?=: |:$)/)
  69. tokens << [:open, :key]
  70. tokens << [match[0,1], :delimiter]
  71. tokens << [match[1..-2], :content]
  72. tokens << [match[-1,1], :delimiter]
  73. tokens << [:close, :key]
  74. key_indent = column(pos - match.size - 1)
  75. # tokens << [key_indent.inspect, :debug]
  76. state = :colon
  77. next
  78. when scan(/(![\w\/]+)(:([\w:]+))?/)
  79. tokens << [self[1], :type]
  80. if self[2]
  81. tokens << [':', :operator]
  82. tokens << [self[3], :class]
  83. end
  84. next
  85. when scan(/&\S+/)
  86. kind = :variable
  87. when scan(/\*\w+/)
  88. kind = :global_variable
  89. when scan(/<</)
  90. kind = :class_variable
  91. when scan(/\d\d:\d\d:\d\d/)
  92. kind = :oct
  93. when scan(/\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d(\.\d+)? [-+]\d\d:\d\d/)
  94. kind = :oct
  95. when scan(/:\w+/)
  96. kind = :symbol
  97. when scan(/[^:\s]+(:(?! |$)[^:\s]*)* .*/)
  98. kind = :error
  99. when scan(/[^:\s]+(:(?! |$)[^:\s]*)*/)
  100. kind = :error
  101. end
  102. else
  103. getch
  104. kind = :error
  105. end
  106. match ||= matched
  107. if $CODERAY_DEBUG and not kind
  108. raise_inspect 'Error token %p in line %d' %
  109. [[match, kind], line], tokens, state
  110. end
  111. raise_inspect 'Empty token', tokens, state unless match
  112. tokens << [match, kind]
  113. end
  114. tokens
  115. end
  116. end
  117. end
  118. end