code: def analyze_scalar(self, scalar):
      # Empty scalar is a special case.
      if not scalar:
          return ScalarAnalysis(
              scalar=scalar,
              empty=True,
              multiline=False,
              allow_flow_plain=False,
              allow_block_plain=True,
              allow_single_quoted=True,
              allow_double_quoted=True,
              allow_block=False,
          )
  
      # Indicators and special characters.
      block_indicators = False
      flow_indicators = False
      line_breaks = False
      special_characters = False
  
      # Important whitespace combinations.
      leading_space = False
      leading_break = False
      trailing_space = False
      trailing_break = False
      break_space = False
      space_break = False
  
      # Check document indicators.
      if scalar.startswith("---") or scalar.startswith("..."):
          block_indicators = True
          flow_indicators = True
  
      # First character or preceded by a whitespace.
      preceded_by_whitespace = True
  
      # Last character or followed by a whitespace.
      followed_by_whitespace = (
          len(scalar) == 1 or scalar[1] in "\0 \t\r\n\x85\u2028\u2029"
      )
  
      # The previous character is a space.
      previous_space = False
  
      # The previous character is a break.
      previous_break = False
  
      index = 0
      while index < len(scalar):
          ch = scalar[index]
  
          # Check for indicators.
          if index == 0:
              # Leading indicators are special characters.
              if ch in "#,[]{}&*!|>'\"%@`":
                  flow_indicators = True
                  block_indicators = True
              if ch in "?:":
                  flow_indicators = True
                  if followed_by_whitespace:
                      block_indicators = True
              if ch == "-" and followed_by_whitespace:
                  flow_indicators = True
                  block_indicators = True
          else:
              # Some indicators cannot appear within a scalar as well.
              if ch in ",?[]{}":
                  flow_indicators = True
              if ch == ":":
                  flow_indicators = True
                  if followed_by_whitespace:
                      block_indicators = True
              if ch == "#" and preceded_by_whitespace:
                  flow_indicators = True
                  block_indicators = True
  
          # Check for line breaks, special, and unicode characters.
          if ch in "\n\x85\u2028\u2029":
              line_breaks = True
          if not (ch == "\n" or "\x20" <= ch <= "\x7E"):
              if (
                  ch == "\x85"
                  or "\xA0" <= ch <= "\uD7FF"
                  or "\uE000" <= ch <= "\uFFFD"
                  or "\U00010000" <= ch < "\U0010ffff"
              ) and ch != "\uFEFF":
                  unicode_characters = True
                  if not self.allow_unicode:
                      special_characters = True
              else:
                  special_characters = True
  
          # Detect important whitespace combinations.
          if ch == " ":
              if index == 0:
                  leading_space = True
              if index == len(scalar) - 1:
                  trailing_space = True
              if previous_break:
                  break_space = True
              previous_space = True
              previous_break = False
          elif ch in "\n\x85\u2028\u2029":
              if index == 0:
                  leading_break = True
              if index == len(scalar) - 1:
                  trailing_break = True
              if previous_space:
                  space_break = True
              previous_space = False
              previous_break = True
          else:
              previous_space = False
              previous_break = False
  
          # Prepare for the next character.
          index += 1
          preceded_by_whitespace = ch in "\0 \t\r\n\x85\u2028\u2029"
          followed_by_whitespace = (
              index + 1 >= len(scalar)
              or scalar[index + 1] in "\0 \t\r\n\x85\u2028\u2029"
          )
  
      # Let's decide what styles are allowed.
      allow_flow_plain = True
      allow_block_plain = True
      allow_single_quoted = True
      allow_double_quoted = True
      allow_block = True
  
      # Leading and trailing whitespaces are bad for plain scalars.
      if (
          leading_space
          or leading_break
          or trailing_space
          or trailing_break
      ):
          allow_flow_plain = allow_block_plain = False
  
      # We do not permit trailing spaces for block scalars.
      if trailing_space:
          allow_block = False
  
      # Spaces at the beginning of a new line are only acceptable for block
      # scalars.
      if break_space:
          allow_flow_plain = (
              allow_block_plain
          ) = allow_single_quoted = False
  
      # Spaces followed by breaks, as well as special character are only
      # allowed for double quoted scalars.
      if space_break or special_characters:
          allow_flow_plain = (
              allow_block_plain
          ) = allow_single_quoted = allow_block = False
  
      # Although the plain scalar writer supports breaks, we never emit
      # multiline plain scalars.
      if line_breaks:
          allow_flow_plain = allow_block_plain = False
  
      # Flow indicators are forbidden for flow plain scalars.
      if flow_indicators:
          allow_flow_plain = False
  
      # Block indicators are forbidden for block plain scalars.
      if block_indicators:
          allow_block_plain = False
  
      return ScalarAnalysis(
          scalar=scalar,
          empty=False,
          multiline=line_breaks,
          allow_flow_plain=allow_flow_plain,
          allow_block_plain=allow_block_plain,
          allow_single_quoted=allow_single_quoted,
          allow_double_quoted=allow_double_quoted,
          allow_block=allow_block,
      )
  
imports: from .error import YAMLError
  from .events import *
label_desc: Use image node_id 45 for calling the Emitter obj's underlying member method code with example usage: obj.analyze_scalar(scalar) and returns: ScalarAnalysis, ScalarAnalysis