86 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| '''notes.py
 | |
| 
 | |
| Used to highlight user-defined "annotations" such as TODO, README, etc.,
 | |
| depending user choice.
 | |
| '''
 | |
| 
 | |
| import sublime
 | |
| 
 | |
| from base_linter import BaseLinter
 | |
| 
 | |
| CONFIG = {
 | |
|     'language': 'Annotations'
 | |
| }
 | |
| 
 | |
| 
 | |
| class Linter(BaseLinter):
 | |
|     DEFAULT_NOTES = ["TODO", "README", "FIXME"]
 | |
| 
 | |
|     def built_in_check(self, view, code, filename):
 | |
|         annotations = self.select_annotations(view)
 | |
|         regions = []
 | |
| 
 | |
|         for annotation in annotations:
 | |
|             regions.extend(self.find_all(code, annotation, view))
 | |
| 
 | |
|         return regions
 | |
| 
 | |
|     def select_annotations(self, view):
 | |
|         '''selects the list of annotations to use'''
 | |
|         return view.settings().get("annotations", self.DEFAULT_NOTES)
 | |
| 
 | |
|     def extract_annotations(self, code, view, filename):
 | |
|         '''extract all lines with annotations'''
 | |
|         annotations = self.select_annotations(view)
 | |
|         annotation_starts = []
 | |
| 
 | |
|         for annotation in annotations:
 | |
|             start = 0
 | |
|             length = len(annotation)
 | |
| 
 | |
|             while True:
 | |
|                 start = code.find(annotation, start)
 | |
| 
 | |
|                 if start != -1:
 | |
|                     end = start + length
 | |
|                     annotation_starts.append(start)
 | |
|                     start = end
 | |
|                 else:
 | |
|                     break
 | |
| 
 | |
|         regions_with_notes = set([])
 | |
| 
 | |
|         for point in annotation_starts:
 | |
|             regions_with_notes.add(view.extract_scope(point))
 | |
| 
 | |
|         regions_with_notes = sorted(list(regions_with_notes))
 | |
|         text = []
 | |
| 
 | |
|         for region in regions_with_notes:
 | |
|             row, col = view.rowcol(region.begin())
 | |
|             text.append("[{0}:{1}]".format(filename, row + 1))
 | |
|             text.append(view.substr(region))
 | |
| 
 | |
|         return '\n'.join(text)
 | |
| 
 | |
|     def find_all(self, text, string, view):
 | |
|         ''' finds all occurences of "string" in "text" and notes their positions
 | |
|             as a sublime Region
 | |
|         '''
 | |
|         found = []
 | |
|         length = len(string)
 | |
|         start = 0
 | |
| 
 | |
|         while True:
 | |
|             start = text.find(string, start)
 | |
| 
 | |
|             if start != -1:
 | |
|                 end = start + length
 | |
|                 found.append(sublime.Region(start, end))
 | |
|                 start = end
 | |
|             else:
 | |
|                 break
 | |
| 
 | |
|         return found
 |