Merge pull request #2120 from keymanapp/developer-add-cli-for-creating-lexical-models-fixes-2083

[Developer] Add -lexical-model command line option for building lexical model template projects to kmconvert.
This commit is contained in:
Marc Durdin 2019-09-25 19:26:24 +10:00 committed by GitHub
commit 38e6d4ed7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 77 additions and 8 deletions

View file

@ -3,6 +3,12 @@
## 13.0 alpha
* Start version 13.0
## 2019-09-25 12.0.37 beta
* Compiler: Add -lexical-model command line option for building lexical model template projects to kmconvert. (#2120)
* Debugger: Remove legacy 'Install keyboard' link in web test and cleanup look somewhat. (#2122)
* Compiler: Support colour log messages and cleanup logging. (#2128)
* Help: Fix some of the issues with Context Help, and address one specific topic - touch layout editor. (#2132)
## 2019-09-24 12.0.36 beta
* General: File type icons were mismatched (#2112)
* Project: Shift layer in basic touch layout template had incorrect modifier for period (.) on shift layer (#2113)

View file

@ -6,7 +6,7 @@ uses
UKeymanTargets;
type
TKMConvertMode = (cmImportWindows, cmTemplate);
TKMConvertMode = (cmImportWindows, cmTemplate, cmLexicalModel);
TKMConvertParameters = record
KLID: string;
@ -20,6 +20,8 @@ type
Targets: TKeymanTargets;
Mode: TKMConvertMode;
NoLogo: Boolean;
ModelIdAuthor, ModelIdLanguage, ModelIdUniq: string;
private
function CheckParam(name, value: string): Boolean;
public
@ -49,6 +51,8 @@ begin
Mode := cmImportWindows
else if ModeString = 'template' then
Mode := cmTemplate
else if ModeString = 'lexical-model' then
Mode := cmLexicalModel
else
Exit(False);
@ -80,20 +84,28 @@ begin
writeln(' Imports a Windows keyboard into a new Keyman keyboard project');
writeln;
writeln('kmconvert template -id <keyboard_id> [additional-options]');
writeln(' Creates a blank keyboard project in the repository template format');
writeln(' Creates a basic keyboard project in the repository template format');
writeln;
writeln('kmconvert lexical-model -id-author <id-author> -id-language <id-language> -id-uniq <id-uniq> [additional-options]');
writeln(' Creates a wordlist lexical model project in the repository template format');
writeln;
writeln('Parameters:');
writeln(' -nologo Don''t show the program description and copyright banner');
writeln(' -klid <source-klid> The KLID of the keyboard to import, per LoadKeyboardLayout');
writeln(' -o <destination> The target folder to write the keyboard project into, defaults to "."');
writeln(' -id <keyboard_id> The id of the keyboard to create');
writeln(' (in `import-windows` mode, can be a format string)');
writeln(' -name <data> Name of the keyboard, e.g. "My First Keyboard", "%s Basic" ');
writeln(' -o <destination> The target folder to write the project into, defaults to "."');
writeln(' -author <data> Name of author of the keyboard/model, no default');
writeln(' -name <data> Name of the keyboard/model, e.g. "My First Keyboard", "%s Basic" ');
writeln(' (format strings are only valid in `import-windows` mode)');
writeln(' -copyright <data> Copyright string for the keyboard, defaults to "Copyright (C)"');
writeln(' -version <data> Version number of the keyboard, defaults to "1.0"');
writeln(' -copyright <data> Copyright string for the keyboard/model, defaults to "Copyright (C)"');
writeln(' -version <data> Version number of the keyboard/model, defaults to "1.0"');
writeln(' -languages <data> space-separated list of BCP 47 tags, e.g. "en-US tpi-PG"');
writeln(' -author <data> Name of author of the keyboard, no default');
// Model parameters
writeln('Note: model identifiers are constructed from params: <id-author>.<id-language>.<id-uniq>');
writeln(' -id-author <data> Identifier for author of model');
writeln(' -id-language <data> Single BCP 47 tag identifying primary language of model');
writeln(' -id-uniq <data> Unique name for the model');
end;
{ TKMConvertParameters }
@ -108,6 +120,11 @@ begin
else if name = '-version' then Version := value
else if name = '-languages' then BCP47Tags := value
else if name = '-author' then Author := value
else if name = '-id-author' then ModelIdAuthor := value
else if name = '-id-language' then ModelIdLanguage := value
else if name = '-id-uniq' then ModelIdUniq := value
else Exit(False);
Result := True;
end;

View file

@ -13,6 +13,7 @@ uses
Keyman.Developer.System.KMConvertParameters,
Keyman.Developer.System.ImportWindowsKeyboard,
Keyman.Developer.System.KeyboardProjectTemplate,
Keyman.Developer.System.ModelProjectTemplate,
KeymanVersion,
VersionInfo;
@ -102,6 +103,43 @@ begin
end;
end;
function DoCreateModelTemplate(FParameters: TKMConvertParameters): Boolean;
var
mpt: TModelProjectTemplate;
FTargetFolder: string;
ModelID: string;
begin
ModelID := FParameters.ModelIdAuthor + '.' + FParameters.ModelIdLanguage + '.' + FParameters.ModelIdUniq;
mpt := TModelProjectTemplate.Create(FParameters.Destination, ModelID);
try
mpt.Name := FParameters.Name;
mpt.Copyright := FParameters.Copyright;
mpt.Version := FParameters.Version;
mpt.BCP47Tags := FParameters.BCP47Tags;
mpt.Author := FParameters.Author;
FTargetFolder := ExtractFileDir(mpt.ProjectFilename);
if DirectoryExists(FTargetFolder) then
begin
writeln('ERROR: The directory "'+FTargetFolder+'" already exists.');
Exit(False);
end;
try
mpt.Generate;
except
on E:EModelProjectTemplate do
begin
writeln(E.Message);
Exit(False);
end;
end;
Result := True;
finally
mpt.Free;
end;
end;
procedure WriteBanner;
begin
writeln(SKeymanDeveloperName + ' Conversion Utility');
@ -133,6 +171,8 @@ begin
Result := DoImportWindowsKeyboard(FParameters);
cmTemplate:
Result := DoCreateKeyboardTemplate(FParameters);
cmLexicalModel:
Result := DoCreateModelTemplate(FParameters);
end;
end;

View file

@ -79,7 +79,10 @@ uses
TouchLayoutUtils in '..\TIKE\oskbuilder\TouchLayoutUtils.pas',
KeyboardFonts in '..\..\global\delphi\general\KeyboardFonts.pas',
Keyman.System.Util.RenderLanguageIcon in '..\..\global\delphi\ui\Keyman.System.Util.RenderLanguageIcon.pas',
utilicon in '..\..\global\delphi\general\utilicon.pas';
utilicon in '..\..\global\delphi\general\utilicon.pas',
Keyman.Developer.System.ModelProjectTemplate in 'Keyman.Developer.System.ModelProjectTemplate.pas',
Keyman.Developer.System.Project.modelTsProjectFile in '..\TIKE\project\Keyman.Developer.System.Project.modelTsProjectFile.pas',
Keyman.Developer.System.Project.wordlistTsvProjectFile in '..\TIKE\project\Keyman.Developer.System.Project.wordlistTsvProjectFile.pas';
{$R icons.RES}
{$R version.res}

View file

@ -179,6 +179,9 @@
<DCCReference Include="..\..\global\delphi\general\KeyboardFonts.pas"/>
<DCCReference Include="..\..\global\delphi\ui\Keyman.System.Util.RenderLanguageIcon.pas"/>
<DCCReference Include="..\..\global\delphi\general\utilicon.pas"/>
<DCCReference Include="Keyman.Developer.System.ModelProjectTemplate.pas"/>
<DCCReference Include="..\TIKE\project\Keyman.Developer.System.Project.modelTsProjectFile.pas"/>
<DCCReference Include="..\TIKE\project\Keyman.Developer.System.Project.wordlistTsvProjectFile.pas"/>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>