imp_javascript.pas

来自「Delphi脚本控件」· PAS 代码 · 共 2,672 行 · 第 1/5 页

PAS
2,672
字号
       if Copy(S, I, L) = P then
       begin
         result.AsVariant := I;

         if TPAXBaseScripter(Scripter).Code.SignZERO_BASED_STRINGS then
           result.AsVariant := result.AsVariant - 1;

         Exit;
       end;
  end;
end;

procedure _String_lastIndexOf(MethodBody: TPAXMethodBody);
var
  S, P: String;
  I, J, L: Integer;
begin
  with MethodBody do
  begin
    result.AsVariant := -1;
    L := ParamCount;
    if L = 0 then
      Exit;
     S := ToString(DefaultValue);
     P := ToString(Params[0].AsVariant);

     if L > 1 then
       J := ToInt32(Params[1].AsVariant)
     else
       J := 1;

     if J <= 0 then
       J := 1;

     L := Length(P);
     for I:=Length(S) - L downto J do
       if Copy(S, I, L) = P then
       begin
         result.AsVariant := I;

         if TPAXBaseScripter(Scripter).Code.SignZERO_BASED_STRINGS then
           result.AsVariant := result.AsVariant - 1;

         Exit;
       end;
  end;
end;

procedure _String_italics(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := '<I>' + ToString(DefaultValue) + '</I>';
end;

procedure _String_link(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
  begin
    if ParamCount > 0 then
      Name := ToString(Params[0].AsVariant)
    else
      Name := 'undefined';
    result.AsVariant := '<A HREF="' + Name + '">' + ToString(DefaultValue) + '</A>';
  end;
end;

procedure _String_slice(M: TPAXMethodBody);
var
  IStart, IEnd, L: Integer;
  S: String;
begin
  with M do
  begin
    S := ToString(DefaultValue);
    L := Length(S);

    if ParamCount = 0 then
    begin
      IStart := 0;
      IEnd := L - 1;
    end
    else if ParamCount = 1 then
    begin
      IStart := ToInt32(Params[0].AsVariant);
      if IStart < 0 then
        IStart := IStart + L;
      IEnd := L - 1;
    end
    else
    begin
      IStart := ToInt32(Params[0].AsVariant);
      IEnd := ToInt32(Params[1].AsVariant);
      if IStart < 0 then
        IStart := IStart + L;
      if IEnd < 0 then
        IEnd := IEnd + L;
    end;

    L := IEnd - IStart + 1;

    if L > 0 then
      result.AsVariant := Copy(S, IStart, L);
  end;
end;

procedure _String_small(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := '<SMALL>' + ToString(DefaultValue) + '</SMALL>';
end;

procedure _String_substr(MethodBody: TPAXMethodBody);
var
  I, L: Integer;
  S: String;
begin
  with MethodBody do
  begin
    S := ToString(DefaultValue);
    I := 1;
    L := Length(S);
    if ParamCount > 0 then
      I := ToInt32(Params[0].AsVariant);
    if ParamCount > 1 then
      L := ToInt32(Params[1].AsVariant);

    if TPAXBaseScripter(Scripter).Code.SignZERO_BASED_STRINGS then
       Inc(I);

    result.AsVariant := Copy(S, I, L);
  end;
end;

procedure _String_substring(MethodBody: TPAXMethodBody);
var
  I, L: Integer;
  S: String;
begin
  with MethodBody do
  begin
    S := ToString(DefaultValue);
    I := 1;
    L := Length(S);
    if ParamCount > 0 then
      I := ToInt32(Params[0].AsVariant);
    if ParamCount > 1 then
      L := ToInt32(Params[1].AsVariant);

    if TPAXBaseScripter(Scripter).Code.SignZERO_BASED_STRINGS then
       Inc(I);

    result.AsVariant := Copy(S, I, L);
  end;
end;

procedure _String_strike(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := '<STRIKE>' + ToString(DefaultValue) + '</STRIKE>';
end;

procedure _String_sub(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := '<SUB>' + ToString(DefaultValue) + '</SUB>';
end;

procedure _String_sup(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := '<SUP>' + ToString(DefaultValue) + '</SUP>';
end;

procedure _String_Split(MethodBody: TPAXMethodBody);
var
  P, S, Q: String;
  L: TStringList;
  Dest: TPAXJavaScriptArrayObject;
  r: TRegExpr;
  I, I1, I2, K: Integer;
  SO: TPaxScriptObject;
  V: Variant;
begin
  with MethodBody do
  begin
    S := ToString(DefaultValue);

    V := Params[0].AsVariant;
    if IsObject(V) then
    begin
      SO := VariantToScriptObject(V);
      if SO.ClassRec.Name = 'RegExp' then
        P := RegExp(SO.Instance).Source
      else
        P := ToString(Params[0].AsString);
    end
    else
      P := ToString(Params[0].AsString);

    L := TStringList.Create;

  	r := TRegExpr.Create;
  	try
{  		r.Expression := P;
      if r.Exec(S) then
			repeat
         I2 := r.MatchPos[0];
         K := r.MatchLen[0];
         Q := Copy(S, I1, I2 - I1);
         L.Add(Q);
         I1 := I2 + K;
			until not r.ExecNext;}

      if Length(P) = 1 then
      begin
        I1 := PosCh(P[1], S);
        while I1 > 0 do
        begin
          Q := Copy(S, 1, I1 - 1);
          L.Add(Q);
          Delete(S, 1, I1);

          I1 := PosCh(P[1], S);
        end;
        L.Add(S);
      end
      else
      begin
        r.Expression := P;
        I1 := 1;
        if r.Exec(S) then
        repeat
          I2 := r.MatchPos[0];
          K := r.MatchLen[0];
          Q := Copy(S, I1, I2 - I1);
          L.Add(Q);
          I1 := I2 + K;
        until not r.ExecNext;
        Q := Copy(S, I1, (Length(S) - I1) + 1);
        L.Add(Q);
      end;


		finally
      Dest := TPAXJavaScriptArrayObject.Create(TPaxBaseScripter(Scripter).ClassList.ArrayClassRec);
      Dest.Length := L.Count;
      for I:=0 to L.Count - 1 do
      begin
        Dest[I] := L[I];
      end;
      r.Free;
      L.Free;
    end;
    result.AsVariant := ScriptObjectToVariant(Dest);
    PSelf := nil;
  end;
end;

procedure _String_toLowerCase(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := LowerCase(ToString(DefaultValue));
end;

procedure _String_toUpperCase(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := UpperCase(ToString(DefaultValue));
end;

procedure _String_valueOf(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := ToString(DefaultValue);
end;

procedure _String_match(MethodBody: TPAXMethodBody);

function StrIsGlobal(const S: String): Boolean;
var
  I, J: Integer;
begin
  result := false;
  for I:=Length(S) downto 1 do
    if S[I] = '\' then
    begin
      for J:=I + 1 to Length(S) do
        if S[I] in ['g','G'] then
        begin
          result := true;
          Exit;
        end;
      Exit;
    end;
end;

var
  P, S, Q: String;
  L: TStringList;
  Dest: TPAXJavaScriptArrayObject;
  r: TRegExpr;
  SO: TPaxScriptObject;
  V: Variant;
  I: Integer;
  IsGlobal: Boolean;
begin
  with MethodBody do
  begin
    S := ToString(DefaultValue);

    V := Params[0].AsVariant;
    if IsObject(V) then
    begin
      SO := VariantToScriptObject(V);
      if SO.ClassRec.Name = 'RegExp' then
      begin
        P := RegExp(SO.Instance).Source;
        IsGlobal := RegExp(SO.Instance).Global;
      end
      else
      begin
        P := ToString(Params[0].AsString);
        IsGlobal := StrIsGlobal(S);
      end;
    end
    else
    begin
      P := ToString(Params[0].AsString);
      IsGlobal := StrIsGlobal(S);
    end;

    L := TStringList.Create;

  	r := TRegExpr.Create;
  	try
  		r.Expression := P;
      if r.Exec(S) then
			repeat
         Q := r.Match[0];
         L.Add(Q);

         if not IsGlobal then
           Break;

			until not r.ExecNext;
		finally
      Dest := TPAXJavaScriptArrayObject.Create(TPaxBaseScripter(Scripter).ClassList.ArrayClassRec);
      Dest.Length := L.Count;
      for I:=0 to L.Count - 1 do
        Dest[I] := L[I];

      Dest.SetProperty(CreateNameIndex('index', Scripter), r.MatchPos[0]);
      Dest.SetProperty(CreateNameIndex('lastIndex', Scripter), r.MatchPos[0] + r.MatchLen[0]);
      Dest.SetProperty(CreateNameIndex('input', Scripter), S);

      r.Free;
      L.Free;
    end;
    result.AsVariant := ScriptObjectToVariant(Dest);
    PSelf := nil;
  end;
end;

procedure _String_replace(MethodBody: TPAXMethodBody);
var
  ReplaceStr: String;
  R: RegExp;
  SO: TPAXJavaScriptStringObject;
  V: Variant;
begin
  with MethodBody do
  begin
    SO := TPAXJavaScriptStringObject(Self);
    ReplaceStr := ToString(Params[1].AsVariant);

    V := Params[0].AsVariant;
    if IsObject(V) then
    begin
      R := RegExp(VariantToScriptObject(V).Instance);
      result.AsVariant := SO.Replace(R, ReplaceStr);
    end
    else
    begin
      R := RegExp.Create;
      R.Source := ToStr(Scripter, V);
      result.AsVariant := SO.Replace(R, ReplaceStr);
      R.Free;
    end;
  end;
end;

procedure _String_search(MethodBody: TPAXMethodBody);
var
  R: RegExp;
  SO: TPAXJavaScriptStringObject;
  V: Variant;
  A: TPAXJavaScriptArrayObject;
begin
  with MethodBody do
  begin
    SO := TPAXJavaScriptStringObject(Self);

    V := Params[0].AsVariant;
    if IsObject(V) then
    begin
      R := RegExp(VariantToScriptObject(V).Instance);
      A := SO.Match(R);
      result.AsVariant := A.GetProperty(CreateNameIndex('index', Scripter));
    end
    else
    begin
      R := RegExp.Create;
      R.Source := ToStr(Scripter, V);
      A := SO.Match(R);
      result.AsVariant := A.GetProperty(CreateNameIndex('index', Scripter));
      R.Free;
    end;
  end;
end;

/////////////// NUMBER ////////////////////////////////////

procedure _Number_New(MethodBody: TPAXMethodBody);
var
  SO: TPAXJavaScriptNumberObject;
  ClassRec: TPAXClassRec;
  R: Variant;
begin
  with MethodBody do
  begin
    ClassRec := TPAXBaseScripter(Scripter).ClassList.NumberClassRec;
    SO := TPAXJavaScriptNumberObject.Create(ClassRec);

    case ParamCount of
      1: R := ToNumber(Params[0].AsVariant);
      else
        R := '';
    end;
    SO.fDefaultValue := R;
    Self := SO;
    Result.AsVariant := R;
  end;
end;

/////////////// ARRAY ////////////////////////////////////

function IsJavaScriptArrayObject(const V: Variant): Boolean;
var
  SO: TPAXScriptObject;
begin
  result := IsObject(V);
  if result then
  begin
    SO := VariantToScriptObject(V);
    result := SO.ClassRec.Name = 'Array';
  end;
end;

constructor TPAXJavaScriptArrayObject.Create(ClassRec: TPAXClassRec);
begin
  inherited Create(ClassRec);
  PaxArray := TPaxArray.Create([0]);
  Instance := Self;
end;

function TPAXJavaScriptArrayObject.ExtraInstance: TObject;
begin
  result := PaxArray;
end;

function TPAXJavaScriptArrayObject.GetLength: Integer;
begin
  result := PaxArray.HighBound(1);
end;

procedure TPAXJavaScriptArrayObject.SetLength(Value: Integer);
begin
  PaxArray.ReDim([Value - 1]);
end;

procedure TPAXJavaScriptArrayObject.PutItem(I: Integer; const Value: Variant);
begin
  PaxArray.PutEx([I], Value);
end;

function TPAXJavaScriptArrayObject.GetItem(I: Integer): Variant;
begin
  result := PaxArray.GetEx([I]);
end;

function TPAXJavaScriptArrayObject.ToString: String;
var
  V: Variant;
  I: Integer;
  S: String;
begin
  result := '';
  for I:=0 to Length - 1 do
  begin
    V := Items[I];
    if IsUndefined(V) then
      S := ''
    else
      S := ToStr(Scripter, V);
    if I > 0 then
     result := result + ',';
    result := result + S;
  end;
end;

function TPAXJavaScriptArrayObject.DefaultValue: Variant;
begin
  result := ToString;
end;

destructor TPAXJavaScriptArrayObject.Destroy;
begin
  if Assigned(PaxArray) then
    PaxArray.Free;
  inherited;
end;

procedure _Array_New(MethodBody: TPAXMethodBody);
var
  SO: TPAXJavaScriptArrayObject;
  I, L: Integer;
  ClassRec: TPaxClassRec;
  V: Variant;
begin
  with MethodBody do
  begin
    if ParamCount = 0 then
      L := 0
    else if ParamCount = 1 then
    begin

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?