-- 字符串操作类函数集合
-- DelSpace,CriterionEn,CompareStr

--**********************************************************************************
--函数名称：DelSpace
--函数功能：过滤字符串的前后空格函数
--传入参数：Str（需要过滤掉前后空格的字符串）
--传出参数：None
--返 回 值：Str（去掉前后空格的字符串）
--备    注：如果整个字符串中只有空格，那么会删除空格
--范    例：Str = " This     is a    box.    "
--          put DelSpace(Str)
--          -- "This     is a    box."
--**********************************************************************************
on DelSpace Str
  NeedStrWordCount = Str.word.count
  Str = Str.word[1..NeedStrWordCount]
  return Str
end

--**********************************************************************************
--函数名称：CriterionEn
--函数功能：规范英文书写，去掉单词间多余的空格，字符串前后空格
--传入参数：Str
--传出参数：None
--返 回 值：去掉前后空格的字符串
--备    注：英文书写中单词之间只能空一格，如果有多余的空格需要去除；
--          如果整个字符串中只有空格，那么会删除空格；
--          多数情况下“CriterionEn”这个函数可以用来代替“DelSpace”这个函数；
--          在只需要去掉前后空格的情况下选用DelSpace这个函数，速度较快。
--范    例：Str = " This     is a    box."
--          put CriterionEn(Str)
--          -- "This is a box."
--**********************************************************************************
on CriterionEn Str
  StrWordCount = Str.word.count
  if StrWordCount = 1 then
    Str = Str.word[1]
  else
    if StrWordCount > 1 then
      TempWord = Str.word[1]
      repeat with i = 2 to StrWordCount
        TempWord = TempWord && Str.word[i]
      end repeat
      Str = TempWord
    end if
  end if
  if StrWordCount = 0 then Str = ""
  return Str
end

--******************************************************************************************
--函数名称：CompareStr
--函数功能：用来比较两个字符串是否相等
--传入参数：InputStr被比较的字符串， RightStr是正确的字符串，SpellMode在什么情况下比较
--传出参数：None
--返 回 值：true or false
--备    注：
--          SpellMode = 1 表示比较的字符串是在一篇文章或者句子中，需要区分大小写
--          SpellMode = 2 表示比较的字符串是单词或词组，根据情况区分大小写；
--                        如果RightStr全部都小写或大写，那么InputStr不要区分大小写；
--                        如果RightStr是特殊名词，如English，需要区分大小写。
--范   例1：InputStr = " english     "
--          RightStr =        English  "
--          put CompareStr(InputStr,RightStr,2) -- 表示是两个英文单词进行比较
--          -- 0
--范   例2：InputStr = " FISH     "
--          RightStr =        fish  "
--          put CompareStr(InputStr,RightStr,2)  -- 表示是两个英文单词进行比较
--          -- 1
--范   例3：InputStr = " FISH     "
--          RightStr =        fish  "
--          put CompareStr(InputStr,RightStr,1)  -- 表示是文章中的单词进行比较
--          -- 0
--范   例4：InputStr = " fish     "
--          RightStr =        fish  "
--          put CompareStr(InputStr,RightStr,1)  -- 表示是文章中的单词进行比较
--          -- 1
--******************************************************************************************
on CompareStr InputStr,RightStr,SpellMode
  
  -- 去除前后空格符
  InputStr = DelSpace(InputStr) -- 去除输入字符的前后空格
  RightStr = CriterionEn(RightStr) -- 规范正确答案的英文属性
  ---------------------------------
  
  -- 得到两个字符串的长度
  InputStrLength = InputStr.length
  RightStrLength = RightStr.length
  ---------------------------------
  
  -- 先比较两个字符串长度是否相等
  if InputStrLength = RightStrLength then
    -- 再比较两个字符串是否大致相同
    if InputStr = RightStr then
      case SpellMode of
        1:
          repeat with i = 1 to RightStrLength
            if CharToNum(InputStr.char[i..i]) <> CharToNum(RightStr.char[i..i]) then
              return false
              exit repeat
            end if
            if i = RightStrLength then return true
          end repeat
        2:
          RigFirCharToNum = CharToNum(RightStr.char[1..1])
          -- RightStr的第一个字符是小写的情况
          if RigFirCharToNum >= 97 and RigFirCharToNum <= 122 then
            -- InputStr必须全部是小写或者大写，才算对
            InpFirCharToNum = CharToNum(InputStr.char[1..1])
            if (InpFirCharToNum >= 97 and InpFirCharToNum <= 122) then
              aa = "small"
            else
              aa = "big"
            end if
            case aa of
              "small":
                repeat with i = 1 to InputStrLength
                  if chartonum(InputStr.char[i..i]) < 97 and chartonum(InputStr.char[i..i]) > 32 then -- InputStr中间有大写的情况
                    return false
                    exit repeat
                  end if
                  if i = InputStrLength then return true
                end repeat
              "big":
                repeat with i = 1 to InputStrLength
                  if chartonum(InputStr.char[i..i]) > 90 then -- InputStr中间有小写的情况
                    return false
                    exit repeat
                  end if
                  if i = InputStrLength then return true
                end repeat
              otherwise:nothing
            end case
          else
            -- RightStr的第一个字符是大写的情况
            -- 判断RightStr的第二个字符是否是大写
            RigSecCharToNum = CharToNum(RightStr.char[2..2])
            if RigSecCharToNum = 32 then RigSecCharToNum = CharToNum(RightStr.char[3..3])
            if RigSecCharToNum >= 97 and RigSecCharToNum <= 122 then -- 这表示第二个字符是小写或者空格
              -- 区分大小写
              repeat with i = 1 to RightStrLength
                if CharToNum(InputStr.char[i..i]) <> CharToNum(RightStr.char[i..i]) then
                  return false
                  exit repeat
                end if
                if i = RightStrLength then return true
              end repeat
            else --表示InputStr的第二个字符是大写
              -- 不区分大小写，但是必须全部是小写或者大写，才算对
              InpFirCharToNum = CharToNum(InputStr.char[1..1])
              if InpFirCharToNum >= 97 and InpFirCharToNum <= 122 then
                aa = "small"
              else
                aa = "big"
              end if
              case aa of
                "small":
                  repeat with i = 1 to InputStrLength
                    if chartonum(InputStr.char[i..i]) < 90 and chartonum(InputStr.char[i..i]) > 65 then -- 中间有大写的情况
                      return false
                      exit repeat
                    end if
                    if i = InputStrLength then return true
                  end repeat
                "big":
                  repeat with i = 1 to InputStrLength
                    if chartonum(InputStr.char[i..i]) > 90 then -- 中间有小写的情况
                      return false
                      exit repeat
                    end if
                    if i = InputStrLength then return true
                  end repeat
                otherwise:nothing
              end case
            end if
          end if
        otherwise:nothing
      end case
    else
      return false
    end if
  else
    return false
  end if
end 