docs: def _process_string_token(self, token, start_row, start_col):
          """Internal method for identifying and checking string tokens
          from the token stream.
  
          Args:
              token: the token to check.
              start_row: the line on which the token was found.
              start_col: the column on which the token was found.
          """
          for i, char in enumerate(token):
              if char in QUOTES:
                  break
  
          # pylint: disable=undefined-loop-variable
          # ignore prefix markers like u, b, r
          norm_quote = token[i:]
  
          # triple-quote strings
          if len(norm_quote) >= 3 and norm_quote[:3] in TRIPLE_QUOTE_OPTS.values():
              self._tokenized_triple_quotes[start_row] = (token, norm_quote[:3], start_row, start_col)
              return
  
          # single quote strings
  
          preferred_quote = SMART_QUOTE_OPTS.get(self.config.string_quote)
  
          # Smart case.
          if self.config.string_quote in SMART_CONFIG_OPTS:
              other_quote = next(q for q in QUOTES if q != preferred_quote)
              # If using the other quote avoids escaping, we switch to the other quote.
              if preferred_quote in token[i + 1:-1] and other_quote not in token[i + 1:-1]:
                  preferred_quote = other_quote
  
          if norm_quote[0] != preferred_quote:
              self._invalid_string_quote(
                  quote=norm_quote[0],
                  row=start_row,
                  correct_quote=preferred_quote,
                  col=start_col,
              )