docs: def _generate_sequences_for_ngram(self, t1, t2, ngram, covered_spans):
          """Generates aligned sequences for the texts `t1` and `t2`, based
          around `ngram`.
  
          Does not generate sequences that occur within `covered_spans`.
  
          :param t1: text content of first witness
          :type t1: `str`
          :param t2: text content of second witness
          :type t2: `str`
          :param ngram: n-gram to base sequences on
          :type ngram: `str`
          :param covered_spans: lists of start and end indices for parts
                                of the texts already covered by a sequence
          :type covered_spans: `list` of two `list`s of 2-`tuple` of `int`
  
          """
          self._logger.debug('Generating sequences for n-gram "{}"'.format(
              ngram))
          pattern = re.compile(re.escape(ngram))
          context_length = len(ngram)
          t1_spans = [match.span() for match in pattern.finditer(t1)]
          t2_spans = [match.span() for match in pattern.finditer(t2)]
          sequences = []
          self._logger.debug(t1)
          for t1_span in t1_spans:
              for t2_span in t2_spans:
                  if self._is_inside(t1_span, t2_span, covered_spans):
                      self._logger.debug(
                          'Skipping match due to existing coverage')
                      continue
                  sequence = self._generate_sequence(
                      t1, t1_span, t2, t2_span, context_length, covered_spans)
                  if sequence:
                      sequences.append(sequence)
          return sequences