Deklarasi kata dan inisial dalam Delphi / Freepascal

Selamat Tahun Baru semuanya! Dalam artikel ini, saya ingin memberi tahu Anda bagaimana saya harus kembali ke proyek warisan di Pascal, dan secara harfiah sebelum mengucapkan selamat tinggal padanya, kepada lazarus, dan tidak adanya tema gelap di luar kotak .





Terakhir kali saya menjelaskan bahwa saya bukan seorang programmer berdasarkan profesinya, tetapi saya menggunakan hobi favorit saya untuk mengotomatiskan segala sesuatu yang berkaitan dengan pekerjaan seorang pengacara. Saya yakin bahwa 90% dari semua birokrasi legal dapat berhasil diotomatiskan: memelihara berbagai database dan kartu, menyusun dokumen sesuai dengan templat, mengontrol waktu tugas, menggunakan layanan tambahan apa pun yang sudah memiliki api sendiri untuk mengotomatiskan sekrup di tempat kerja tertentu, dll. dll. Hal ini diperlukan untuk memperjuangkan ini agar, menurut perintah Isaac Asimov, untuk meluangkan waktu seorang pengacara untuk pelaksanaan tugas utama - untuk merefleksikan ketentuan kontrak dan membiakkan hasutan di pengadilan.






Jadi, beberapa tahun yang lalu saya melakukan proyek yang sangat besar untuk membuat pekerjaan kantor saya lebih mudah. Dia mengumpulkan semua data tentang merek dagang dan paten (dan ada beberapa ratus di antaranya), mengontrol waktu pembayaran biaya paten, membentuk perintah pembayaran, kontrak, aplikasi, dan, tentu saja, mengeluarkan berbagai laporan. Sebenarnya kenapa di masa lampau? Proyek ini cukup berhasil. Itu baru saja dikembangkan sesuai dengan semua kemungkinan anti-pola, dengan semua sepeda dan kruk yang hanya ditemukan di Bumi. Untuk kembali ke kode Rolton (atau doshirak) ini untuk memfaktorkan ulangnya , oh, saya tidak mau, karena meme " Ayo tulis ulang semuanya di ... " sempurna di sini .





Namun, sayangnya, menulis ulang semuanya dalam bahasa baru untuk platform baru atau bahkan beberapa adalah bisnis yang panjang dan berlarut-larut, dan dokumen perlu diberi cap di sini dan sekarang. Oleh karena itu, saya harus kembali ke Pascal dari waktu ke waktu.





Salah satu hari yang indah, seluruh proyek dibangun kembali pada platform 64-bit, dan, yang mengejutkan saya, bagian yang paling favorit jatuh: pembuatan kontrak dan pernyataan dengan otomatisasi penuh dari semua tata bahasa dan morfologi - kemunduran inisial, posisi, dan kata lain dalam kasus yang diperlukan, dan Lihat juga tunggal / jamak. Masalahnya adalah bahwa pustaka padegUC Delphic dan berpemilik lama tidak lagi gratis dalam versi 64-bitnya.





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);
      
      



Untuk semua orang yang tertarik, saya akan menyimpan pustaka yang saya hasilkan dengan aplikasi jendela uji untuk menang dalam repositori terbuka . Kemungkinan besar, saya tidak akan memulai apa pun di dalamnya, karena sekarang saya telah terjun ke lautan terbuka pengembangan seluler (kotlin) dan python untuk menerapkan meme yang sama "menulis ulang semuanya di ..."





Selamat Tahun Baru 2020 + '1' semuanya!








All Articles