code: def split_vietnamese_syllable(s):
      onset, right_side, tone = None, None, None
  
      if re.match(
          r"^[aàáảãạăằắẳẵặâầấẩẫậeèéẻẽẹêềếểễệiìíỉĩịoòóỏõọôồốổỗộơờớởỡợuùúủũụưừứửữựyỳýỷỹỵ]",
          s,
      ):  # no leading onset
          onset = ""
          if re.match(r"^[yỳýỷỹỵ]", s):  # s = y_
              if re.match(
                  r"^y[êềếểễệ]([mu]|ng?)|y[ếệ]t$", s
              ):  # s = yê_
                  right_side = "i" + s[1:]
          else:
              right_side = s
  
      elif s.startswith("qu"):  # `qu_` group
          onset = "qu"
  
          if re.match(r"^qu[ốộ]c$", s):  # u_ rime
              right_side = s[1:]
  
          else:  # tính vần đằng sau
              if re.match(
                  r"^qu[yỳýỷỹỵ].*$", s
              ):  # "quy.*"  # -> i* rime
                  right_side = s[2].translate(yi_trans) + s[3:]
              else:  # "qu(.+)"
                  right_side = s[2:]
  
      elif re.match(r"^g[iìíỉĩị]", s):  # `gi_` group
          onset = "gi"
  
          if re.match(
              r"^gi[êềếểễệ]([mu]|ng?)|gi[ếệ][cpt]|g[íị](p|ch)|g[iìíỉĩị]n?$",
              s,
          ):
              # i_ rime, gi_ = gi + i_
              # "giê([mu]|[cpt]|ng?)"  # -> iê_
              # "gin?", "gi(p|ch)"  # -> i*
              right_side = s[1:]
  
          else:  # rime comes after gi: "gi(.+)"
              right_side = s[2:]
  
      else:
          # all-rime group
          free_type = re.findall(
              r"^([bdđlmrsvx]|[cknp]?h|t[hr]?|n(?!g)|p(?!h))(.+)$", s
          )
          if free_type:
              onset, right_side = free_type[0]
  
          # eiy group ("eêiy"):
          eiy_type = re.findall(
              r"^(k|n?gh)([eèéẻẽẹêềếểễệiìíỉĩịyỳýỷỹỵ].*)$", s
          )
          if eiy_type:
              onset, right_side = eiy_type[0]
  
          # aou group ("aăâoôơuư"):
          aou_type = re.findall(
              r"^(c|n?g)([aàáảãạăằắẳẵặâầấẩẫậoòóỏõọôồốổỗộơờớởỡợuùúủũụưừứửữự].*)$",
              s,
          )
          if aou_type:
              onset, right_side = aou_type[0]
  
      if onset is not None and right_side is not None:
          rime = get_rime(right_side)
          tone = get_tone(right_side)
  
          if rime:
              return (onset, rime, tone)
  
file_path: underthesea/examples/text_normalize/process_viwiktionary.py
imports: from os.path import join
  from underthesea.file_utils import DATASETS_FOLDER
  from underthesea.pipeline.word_tokenize.regex_tokenize import VIETNAMESE_CHARACTERS_LOWER, VIETNAMESE_VOWELS_LOWER
  import re
label_desc: Use image node_id 4 for calling a global function with example usage: split_vietnamese_syllable(s) and returns: onset,  rime,  tone