summaryrefslogtreecommitdiff
path: root/lib/coderay/encoders/lines_of_code.rb
blob: 32c01927e89a6960fe3ee8e5da3b75fb5872abb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
module CodeRay
module Encoders
  
  # Counts the LoC (Lines of Code). Returns an Integer >= 0.
  # 
  # Everything that is not comment, markup, doctype/shebang, or an empty line,
  # is considered to be code.
  # 
  # For example,
  # * HTML files not containing JavaScript have 0 LoC
  # * in a Java class without comments, LoC is the number of non-empty lines
  # 
  # A Scanner class should define the token kinds that are not code in the
  # KINDS_NOT_LOC constant.
  class LinesOfCode < Encoder
    
    register_for :lines_of_code
    
    NON_EMPTY_LINE = /^\s*\S.*$/
    
    def compile tokens, options
      kinds_not_loc = tokens.scanner.class::KINDS_NOT_LOC
      code = tokens.token_class_filter :exclude => kinds_not_loc
      @loc = code.text.scan(NON_EMPTY_LINE).size
    end
    
    def finish options
      @loc
    end
    
  end
  
end
end