Delphi / Freepascalでの単語とイニシャルの減少

みなさん、こんにちは!この記事では、文字通り彼、ラザロ、そしてから出して暗いテーマがないことに別れを告げる前に、パスカルのレガシープロジェクトに戻る必要があった方法を説明したいと思います





前回、私は職業上のプログラマーではないと説明しましたが、私の好きな趣味を使って、弁護士の仕事で手に入るすべてのものを自動化します。さまざまなデータベースやカードの保守、テンプレートに従ってドキュメントの作成、タスクのタイミングの制御、特定の職場で自動化を行うための独自のapiをすでに備えている補助サービスの使用など、すべての合法的なレッドテープの90%を正常に自動化できると確信しています。等Isaac Asimov要請によれば、主な任務を遂行するために弁護士の時間解放するために、これに向けて努力する必要があります-契約の条件を熟考し、法廷で民主主義を繁殖させるためです。






それで、何年も前に私は私のオフィスの仕事をより簡単にするために非常に大きなプロジェクトをしました。彼は商標と特許に関するすべてのデータを収集し(そしてそれらは数百あります)、特許料の支払いのタイミングを管理し、支払い注文、契約、申請を作成し、そしてもちろん、さまざまなレポートを発行しました。実は、なぜ過去の緊張で?プロジェクトはかなり機能しています。それは、地球上でのみ発見されたすべての自転車とクラッチを使用して、考えられるすべてのアンチパターンに従って開発されました。リファクタリングするためにこのRolton(またはdoshirak)コード戻るために、ああ、私はしたくありませんでした。なぜなら、ミーム「すべてを書き直そう...がここで完璧だからです。





しかし、残念ながら、すべてを新しいプラットフォーム用に新しい言語で書き直すことは、長くて長引くビジネスであり、ドキュメントには今ここでスタンプを押す必要があります。したがって、私は時々パスカルに戻らなければなりません。





素晴らしい日の1つで、プロジェクト全体が64ビットプラットフォームで再構築されました。驚いたことに、最も気に入った部分は次のとおりです。すべての文法と形態を完全に自動化した契約とステートメントの生成-必要な場合のイニシャル、位置、その他の単語の傾斜、単数/複数も参照してください。重要なのは、古いDelphicと独自のpadegUCライブラリが64ビットバージョンで無料でなくなったことです。





32- , . .





- , . , :





IInitialsMorpher = interface
  function GetInitials(Initials: string): CasesResponse;
  function GetWordsCase(Words: string): CasesResponse;
  function GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
end;
      
      



, , -: (.. ), , , , , , .. CasesResponse , Gender - :





TWordCase = (Nominative, Gentitive, Dative, Accusative, Instrumental, Prepositional);
TGender = (Male, Female, UnrecognizedGender);
CasesResponse = array[TWordCase] of string;
      
      



. , :

















DaData





-





-





-





- -





-





Pymorphy





github





- MIT , python





- Corpora ( )





- , .. , , , ..





- , , ..





Morphos





- MIT , php





-





-





- ,





, Morphos, / .





rest api, json, , http, :





generic function JSONfromRestUri<T>(Uri: string): T;
var
  HTTPSender: THTTPSend;
  JSONStreamer: TJSONDeStreamer;
  Json: TJSONObject;
begin
  HTTPSender := THTTPSend.Create;
  JSONStreamer := TJSONDeStreamer.Create(nil);
  HTTPSender.Clear;
  Result := T.Create;
  if not HTTPSender.HTTPMethod('GET', Uri) then 
  		raise EInOutError.Create(RESTOUT_ERROR);
  JSON := GetJSON(HTTPSender.Document) as TJSONObject;
  JSONStreamer.JSONToObject(JSON, Result);
  FreeAndNil(JSON);
  FreeAndNil(JSONStreamer);
  FreeAndNil(HTTPSender);
end;
      
      



Freepascal Synapse Fpjson, (httpsend, fpjson, fpjsonrtti) uses. json rtti, .. , -, published, -, (, , ), -, json. , @SerializedName , .





Morphos :





MORPHOS_URL = 'http://morphos.io/api/inflect-name?name=%s&_format=json';
      
      



json , - / , , name gender:





{
    "name": " ",
    "cases": [
        " ",
        " ",
        " ",
        " ",
        " ",
        "  "
    ],
    "gender": "m"
}
      
      



IInitialsMorpher Morpher. , json Fpjson ( , TPersistent):





TMorphosResponse = class(TPersistent)
  private
    fCases: TStrings;
    fGender: string;
    fName: string;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property name: string read fName write fName;
    property cases: TStrings read fCases write fCases;
    property gender: string read fGender write fGender;
  end;
      
      



:





TMorphosImpl = class(TInterfacedObject, IInitialsMorpher)
  public
    function GetInitials (Initials: string): CasesResponse;
    function GetWordsCase (Words: string): CasesResponse;
    function GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
  end;
      
      



, :





function TMorphosImpl.GetGenderAndInitials(Initials: string; var Gender: TGender): CasesResponse;
var
  inf: TWordCase;
  i: integer = 0;
  response: TMorphosResponse;
begin
  response := specialize JSONfromRestUri<TMorphosResponse>
                (Replacetext(Format(MORPHOS_URL, [Initials]), ' ', '+'));
  for inf in TWordCase do begin
      Result[inf] := response.cases[i];
      inc(i);
  end;
  case response.gender of
       'm': Gender := Male;
       'f': Gender := Female;
       else Gender := UnrecognizedGender;
  end;
  FreeAndNil(response);
end;
      
      



, . , ( ) , , - :





function TMorphosImpl.GetInitials(Initials: string): CasesResponse;
var
  MokeGender: TGender = UnrecognizedGender;
begin
  Result := GetGenderAndInitials(Initials, MokeGender);
end;

function TMorphosImpl.GetWordsCase(Words: string): CasesResponse;
var
  inf: TWordCase;
begin
  Result := GetInitials(Words);
  for inf in TWordCase do
    Result[inf] := UTF8LowerString(Result[inf]);
end;
      
      



, . , . . , , , DI- - "" .





- -, ( , , - ?) - http-. Morphos , DaData , 10 .





, . , json ashMap- Generics.Collections - , freepascal delphi. , - ( , http- , ).





Morphos :





Morpher := TMorphFabric.Create(MORPHOS);
//...
response := Morpher.GetInitials(Text)
StringList.AddStrings(response);
      
      



興味のあるすべての人のために、私は開いたリポジトリに勝つためのテストウィンドウアプリケーションで結果のライブラリを保持しますおそらく、私はその中で何も開始しません。なぜなら、今、私はモバイル開発(kotlin)とpythonの外洋に飛び込んで、まったく同じミームを実装するために「すべてを書き直します...」





2020年明けましておめでとうございます+「1」みんな!








All Articles