mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-06 08:55:34 +00:00
Follows on from the similar changes to `Keyboard` fields in #13600. This deprecates the `RTL` and `Name` fields. `RTL` was never used. `Name` was written but never presented to end users, so effectively irrelevant. `Name` also was present in `File.Description` (already deprecated) for the corresponding model.js _and_ `Info.Name`, so doubly redundant. Also updates the schema documentation to mark the deprecated fields. Relates-to: #13600
197 lines
5.3 KiB
ObjectPascal
197 lines
5.3 KiB
ObjectPascal
unit Keyman.Developer.System.ModelProjectTemplate;
|
|
|
|
interface
|
|
|
|
uses
|
|
System.SysUtils,
|
|
|
|
Keyman.Developer.System.ProjectTemplate,
|
|
kpsfile,
|
|
UKeymanTargets,
|
|
utilfiletypes;
|
|
|
|
type
|
|
EModelProjectTemplate = class(Exception);
|
|
|
|
TModelProjectTemplate = class(TProjectTemplate)
|
|
private
|
|
procedure WriteModel;
|
|
procedure WriteWordlist;
|
|
procedure WriteKPS;
|
|
procedure WriteKPJ;
|
|
function GetModelFilename: string;
|
|
function GetWordlistFilename: string;
|
|
|
|
protected
|
|
const
|
|
SFileTemplate_Package = '%s.model.kps';
|
|
SFilename_Model = 'model.ts'; // Only for source
|
|
SFilename_Wordlist = 'wordlist.tsv';
|
|
SFileTemplate_Model = '%s.model.ts';
|
|
SFileTemplate_CompiledModel = '%s.model.js';
|
|
SDataPath_WordlistLexicalModel = 'wordlist-lexical-model\';
|
|
|
|
function DataPath: string; override;
|
|
function GetPackageFilename: string; override;
|
|
|
|
public
|
|
constructor Create(const BasePath, ModelID: string);
|
|
procedure Generate; override;
|
|
|
|
property ModelFilename: string read GetModelFilename;
|
|
property WordlistFilename: string read GetWordlistFilename;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
System.Classes,
|
|
System.StrUtils,
|
|
|
|
BCP47Tag,
|
|
Keyman.System.LanguageCodeUtils,
|
|
KeymanVersion,
|
|
Keyman.Developer.System.Project.modelTsProjectFile,
|
|
Keyman.Developer.System.Project.kpsProjectFile,
|
|
Keyman.Developer.System.Project.wordlistTsvProjectFile,
|
|
Keyman.Developer.System.Project.ProjectFile,
|
|
Keyman.Developer.System.Project.ProjectFiles,
|
|
PackageInfo,
|
|
RedistFiles,
|
|
utilstr;
|
|
|
|
{ TModelProjectTemplate }
|
|
|
|
constructor TModelProjectTemplate.Create(const BasePath, ModelID: string);
|
|
begin
|
|
inherited Create(BasePath, ModelID, TouchKeymanTargets);
|
|
end;
|
|
|
|
procedure TModelProjectTemplate.Generate;
|
|
begin
|
|
if not ForceDirectories(BasePath + ID + '\' + SFolder_Source) then
|
|
raise EModelProjectTemplate.Create('Could not create destination path '+BasePath+ID);
|
|
|
|
WriteDocumentation;
|
|
|
|
WriteModel;
|
|
WriteWordlist;
|
|
WriteKPS;
|
|
WriteKPJ;
|
|
|
|
WriteRepositoryMetadata;
|
|
end;
|
|
|
|
function TModelProjectTemplate.GetModelFilename: string;
|
|
begin
|
|
Result := GetFilename(Format(SFileTemplate_Model, [ID]));
|
|
end;
|
|
|
|
function TModelProjectTemplate.GetWordlistFilename: string;
|
|
begin
|
|
Result := GetFilename(SFilename_Wordlist);
|
|
end;
|
|
|
|
function TModelProjectTemplate.GetPackageFilename: string;
|
|
begin
|
|
Result := GetFilename(Format(SFileTemplate_Package, [ID]));
|
|
end;
|
|
|
|
procedure TModelProjectTemplate.WriteModel;
|
|
begin
|
|
Transform(SFolder_Source + '\' + SFilename_Model,
|
|
Format(SFolder_Source + '\' + SFileTemplate_Model, [ID]));
|
|
end;
|
|
|
|
procedure TModelProjectTemplate.WriteWordlist;
|
|
begin
|
|
Transform(SFolder_Source + '\' + SFilename_Wordlist);
|
|
end;
|
|
|
|
procedure TModelProjectTemplate.WriteKPJ;
|
|
var
|
|
kpj: TProject;
|
|
begin
|
|
kpj := TProject.Create(ptLexicalModel, GetProjectFilename, False);
|
|
try
|
|
kpj.Options.Version := pv20;
|
|
kpj.Options.BuildPath := '$PROJECTPATH\' + SFolder_Build;
|
|
kpj.Options.SourcePath := '$PROJECTPATH\' + SFolder_Source;
|
|
kpj.Options.WarnDeprecatedCode := True;
|
|
kpj.Options.CompilerWarningsAsErrors := True;
|
|
kpj.Options.CheckFilenameConventions := True;
|
|
kpj.Options.SkipMetadataFiles := False;
|
|
|
|
// Add model and package to project
|
|
kpj.Files.Add(TmodelTsProjectFile.Create(kpj, GetModelFilename, nil));
|
|
kpj.Files.Add(TkpsProjectFile.Create(kpj, GetPackageFilename, nil));
|
|
|
|
// Add metadata files to project
|
|
kpj.Files.Add(TOpenableProjectFile.Create(kpj, BasePath + ID + '\' + SFile_HistoryMD, nil));
|
|
kpj.Files.Add(TOpenableProjectFile.Create(kpj, BasePath + ID + '\' + SFile_LicenseMD, nil));
|
|
kpj.Files.Add(TOpenableProjectFile.Create(kpj, BasePath + ID + '\' + SFile_ReadmeMD, nil));
|
|
|
|
kpj.Save;
|
|
finally
|
|
kpj.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TModelProjectTemplate.WriteKPS;
|
|
var
|
|
kps: TKPSFile;
|
|
f: TPackageContentFile;
|
|
plm: TPackageLexicalModel;
|
|
begin
|
|
kps := TKPSFile.Create;
|
|
try
|
|
// Set kps metadata
|
|
kps.Info.Desc[PackageInfo_Name] := Name;
|
|
kps.Info.Desc[PackageInfo_Copyright] := Copyright;
|
|
kps.Info.Desc[PackageInfo_Author] := Author;
|
|
kps.Info.Desc[PackageInfo_Version] := Version;
|
|
kps.Info.Desc[PackageInfo_Description] := Description;
|
|
kps.FileName := GetPackageFilename;
|
|
|
|
// Add model.js
|
|
f := TPackageContentFile.Create(kps);
|
|
f.FileName := BasePath + ID + '\' + SFolder_Build + '\' + Format(SFileTemplate_CompiledModel, [ID]);
|
|
kps.Files.Add(f);
|
|
|
|
// Add welcome
|
|
f := TPackageContentFile.Create(kps);
|
|
f.FileName := BasePath + ID + '\' + SFolder_Source + '\' + SFile_WelcomeHTM;
|
|
kps.Files.Add(f);
|
|
kps.Options.WelcomeFile := f;
|
|
|
|
// Add readme
|
|
f := TPackageContentFile.Create(kps);
|
|
f.FileName := BasePath + ID + '\' + SFolder_Source + '\' + SFile_ReadmeHTM;
|
|
kps.Files.Add(f);
|
|
kps.Options.ReadmeFile := f;
|
|
|
|
// Add license
|
|
f := TPackageContentFile.Create(kps);
|
|
f.FileName := BasePath + ID + '\' + SFile_LicenseMD;
|
|
kps.Files.Add(f);
|
|
kps.Options.LicenseFile := f;
|
|
|
|
// Add metadata about the lexical model
|
|
plm := TPackageLexicalModel.Create(kps);
|
|
plm.ID := ID;
|
|
kps.LexicalModels.Add(plm);
|
|
|
|
SetPackageLanguageMetadata(kps, plm.Languages);
|
|
|
|
kps.SaveXML;
|
|
finally
|
|
kps.Free;
|
|
end;
|
|
end;
|
|
|
|
function TModelProjectTemplate.DataPath: string;
|
|
begin
|
|
Result := inherited DataPath + SDataPath_WordlistLexicalModel;
|
|
end;
|
|
|
|
end.
|