json2entities.lpr 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. program json2entities;
  2. uses fpjson, jsonparser, sysutils, classes;
  3. function GetJSONData(const aFileName : string) : TJSONObject;
  4. var
  5. lData : TJSONData;
  6. lFile : TFileStream;
  7. begin
  8. lFile:=TFileStream.Create(aFileName,fmOpenRead);
  9. try
  10. lData:=GetJSON(lFile);
  11. if not (lData is TJSONObject) then
  12. begin
  13. lData.Free;
  14. Raise EJSON.Create('Not a JSON object');
  15. end;
  16. Result:=TJSONObject(lData);
  17. finally
  18. lFile.Free;
  19. end;
  20. end;
  21. Procedure GetUnitEnd(aUnit : TStrings);
  22. begin
  23. With aUnit do
  24. begin
  25. Add('');
  26. Add('implementation');
  27. Add('');
  28. Add('end.');
  29. end;
  30. end;
  31. Procedure GetUnitStart(aUnit : TStrings; const aFileName : string);
  32. begin
  33. With aUnit do
  34. begin
  35. Add('unit %s;',[ChangeFileExt(ExtractFileName(aFileName),'')]);
  36. Add('');
  37. Add('// see also https://html.spec.whatwg.org/entities.json');
  38. Add('');
  39. Add('interface');
  40. Add('');
  41. Add('Type');
  42. Add(' THTMLEntityDef = record');
  43. Add(' e : AnsiString;');
  44. Add(' u : Unicodestring;');
  45. Add(' end;');
  46. Add(' THTMLEntityDefList = Array of THTMLEntityDef;');
  47. Add('');
  48. end;
  49. end;
  50. Procedure JSONToConst(lJSON : TJSONObject; aUnit : TStrings);
  51. var
  52. I,L : integer;
  53. ln,LastN,N,VS : String;
  54. U : UnicodeString;
  55. UC : UnicodeChar;
  56. lList : TStringList;
  57. begin
  58. lList:=TstringList.Create;
  59. LastN:=N;
  60. with aUnit do
  61. begin
  62. Add('const');
  63. Add(' EntityDefList : THTMLEntityDefList = (');
  64. For I:=0 to lJSON.Count-1 do
  65. begin
  66. N:=lJSON.Names[i];
  67. System.Delete(N,1,1);
  68. l:=Length(N);
  69. if N[L]=';' then
  70. SetLength(N,L-1);
  71. if N=LastN then
  72. continue;
  73. LastN:=N;
  74. U:=UTF8Decode(TJSONObject(lJSON.Items[i]).Get('characters',''));
  75. VS:='';
  76. For UC in U do
  77. VS:=VS+'#$'+HexStr(Ord(UC),4);
  78. ln:=Format('(e:''%s''; u: %s)',[N,VS]);
  79. lList.Add(ln);
  80. end;
  81. for I:=0 to lList.Count-1 do
  82. begin
  83. ln:=lList[I];
  84. if I<LList.Count-1 then
  85. ln:=ln+',';
  86. Add(' '+ln);
  87. end;
  88. Add(');');
  89. end;
  90. end;
  91. var
  92. lJSON : TJSONObject;
  93. lUnit : TStrings;
  94. begin
  95. if ParamCount<2 then
  96. begin
  97. Writeln('Usage: ',ParamStr(0),' inputfile outputfile');
  98. Halt(1);
  99. end;
  100. lUnit:=Nil;
  101. lJSON:=GetJSONData(ParamStr(1));
  102. try
  103. lUnit:=TStringList.Create;
  104. GetUnitStart(LUnit,ParamStr(2));
  105. JSONToConst(lJSON,lUnit);
  106. GetUnitEnd(lUnit);
  107. lUnit.SaveToFile(ParamStr(2));
  108. finally
  109. lJSON.Free;
  110. lUnit.Free;
  111. end;
  112. end.