Keeps track of active markers in the current README on a line-by-line basis.
| 56 | |
| 57 | |
| 58 | class MarkerTracker: |
| 59 | """ |
| 60 | Keeps track of active markers in the current README on a line-by-line basis. |
| 61 | """ |
| 62 | |
| 63 | def __init__(self, readme): |
| 64 | self.readme = readme |
| 65 | self.active_markers = set() |
| 66 | self.entering_markers = set() # The markers that we are currently entering |
| 67 | self.exiting_markers = set() # The markers that we are currently exiting |
| 68 | |
| 69 | def __enter__(self): |
| 70 | self.file = open(self.readme, "r") |
| 71 | return self |
| 72 | |
| 73 | def __exit__(self, exc_type, exc_value, traceback): |
| 74 | self.file.close() |
| 75 | |
| 76 | def __iter__(self): |
| 77 | for line in self.file.readlines(): |
| 78 | stripped_line = line.strip() |
| 79 | self.entering_markers.clear() |
| 80 | self.exiting_markers.clear() |
| 81 | |
| 82 | for marker in VALID_MARKERS.values(): |
| 83 | if not self.is_in(marker) and marker.matches_start(stripped_line): |
| 84 | self.active_markers.add(marker) |
| 85 | self.entering_markers.add(marker) |
| 86 | elif marker.matches_end(stripped_line): |
| 87 | self.active_markers.remove(marker) |
| 88 | self.exiting_markers.add(marker) |
| 89 | |
| 90 | yield line.rstrip() |
| 91 | |
| 92 | def is_in(self, marker): |
| 93 | """ |
| 94 | Whether we are currently on a line between the specified start and end marker. |
| 95 | This will always return False for a line containing the marker itself. |
| 96 | """ |
| 97 | return marker in self.active_markers and not (self.entering(marker) or self.exiting(marker)) |
| 98 | |
| 99 | def entering(self, marker): |
| 100 | return marker in self.entering_markers |
| 101 | |
| 102 | def exiting(self, marker): |
| 103 | return marker in self.exiting_markers |
| 104 | |
| 105 | |
| 106 | class CommandBlock: |
no outgoing calls