code: def run(self):
          
          n_target_file, n_other_file = 0, 0
  
          code, comment, docstr, purecode = 0, 0, 0, 0
  
          fc = FileCollection.from_path_except(self.workspace, self.ignore)
  
          fc_yes, fc_no = fc.select(self.filter, keepboth=True)
          n_other_file += len(fc_no)
  
          for abspath in fc_yes:
              try:
                  with open(abspath, "rb") as f:
                      code_text = f.read().decode("utf-8")
                      code_, comment_, docstr_, purecode_ = self.analyzer(
                          code_text)
                      code += code_
                      comment += comment_
                      docstr += docstr_
                      purecode += purecode_
                      n_target_file += 1
              except Exception as e:
                  n_other_file += 1
  
          lines = list()
          lines.append("Code statistic result for '%s'" % self.workspace)
          lines.append("  %r %r files, %r other files." %
                       (n_target_file, self.language, n_other_file))
          lines.append("    code line: %s" % code)
          lines.append("    comment line: %s" % comment)
          lines.append("    docstr line: %s" % docstr)
          lines.append("    purecode line: %s" % purecode)
          message = "\n".join(lines)
  
          print(message)
          return message
docs: Run analysis.
  
          The basic idea is to recursively find all script files in specific 
          programming language, and analyze each file then sum it up.