mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-07 01:15:33 +00:00
203 lines
5.3 KiB
ObjectPascal
203 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;
|
|
procedure WriteModelInfo;
|
|
function GetModelFilename: string;
|
|
function GetWordlistFilename: string;
|
|
|
|
protected
|
|
const
|
|
SFileTemplate_ModelInfo = '%s.model_info'; // in root
|
|
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.ProjectFile,
|
|
Keyman.Developer.System.Project.ProjectFiles,
|
|
PackageInfo,
|
|
RedistFiles,
|
|
TouchLayout,
|
|
utilstr,
|
|
VisualKeyboard;
|
|
|
|
{ TModelProjectTemplate }
|
|
|
|
constructor TModelProjectTemplate.Create(const BasePath, ModelID: string);
|
|
begin
|
|
inherited Create(BasePath, ModelID);
|
|
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;
|
|
|
|
WriteModelInfo;
|
|
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.WriteModelInfo;
|
|
begin
|
|
// Write modelid.model_info
|
|
Transform(
|
|
Format(SFileTemplate_ModelInfo, ['model']),
|
|
Format(SFileTemplate_ModelInfo, [ID])
|
|
);
|
|
end;
|
|
|
|
procedure TModelProjectTemplate.WriteWordlist;
|
|
begin
|
|
Transform(SFolder_Source + '\' + SFilename_Wordlist);
|
|
end;
|
|
|
|
procedure TModelProjectTemplate.WriteKPJ;
|
|
var
|
|
kpj: TProject;
|
|
begin
|
|
kpj := TProject.Create(ptLexicalModel, GetProjectFilename);
|
|
try
|
|
kpj.Options.BuildPath := '$PROJECTPATH\' + SFolder_Build;
|
|
kpj.Options.WarnDeprecatedCode := True;
|
|
kpj.Options.CompilerWarningsAsErrors := True;
|
|
kpj.Options.CheckFilenameConventions := True;
|
|
|
|
// Add keyboard 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.Files.Add(TOpenableProjectFile.Create(kpj, BasePath + ID + '\' + Format(SFileTemplate_ModelInfo, [ID]), 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.KPSOptions.FollowKeyboardVersion := True;
|
|
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);
|
|
|
|
// Add readme
|
|
f := TPackageContentFile.Create(kps);
|
|
f.FileName := BasePath + ID + '\' + SFolder_Source + '\' + SFile_ReadmeHTM;
|
|
kps.Files.Add(f);
|
|
kps.Options.ReadmeFile := f;
|
|
|
|
// Add metadata about the keyboard
|
|
plm := TPackageLexicalModel.Create(kps);
|
|
plm.Name := Name;
|
|
plm.ID := ID;
|
|
plm.Version := Version;
|
|
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.
|