mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-10 19:05:31 +00:00
[linux] 1187 handle more than one keyboard in legacy kmp
and more file types for 1189
This commit is contained in:
parent
8029aeb767
commit
1a01489e41
2 changed files with 71 additions and 18 deletions
|
|
@ -61,15 +61,6 @@ def get_infdata(tmpdirname):
|
|||
kmpinf = os.path.join(tmpdirname, "kmp.inf")
|
||||
if os.path.isfile(kmpinf):
|
||||
info, system, options, keyboards, files = parseinfdata(kmpinf, False)
|
||||
if files and not keyboards:
|
||||
id = "unknown"
|
||||
for kbfile in files:
|
||||
if kbfile['type'] == KMFileTypes.KM_KMX:
|
||||
id = os.path.basename(os.path.splitext(kbfile['name'])[0])
|
||||
#inf file may not have keyboards so generate it if needed
|
||||
keyboards = [ { 'name' : info['name']['description'],
|
||||
'id' : id,
|
||||
'version' : info['version']['description'] } ]
|
||||
return info, system, options, keyboards, files
|
||||
else:
|
||||
return None, None, None, None, None
|
||||
|
|
|
|||
|
|
@ -13,10 +13,14 @@ class KMFileTypes(Enum):
|
|||
KM_SOURCE = auto()
|
||||
KM_KMX = auto()
|
||||
KM_KVK = auto()
|
||||
KM_TOUCH = auto()
|
||||
KM_FONT = auto()
|
||||
KM_DOC = auto()
|
||||
KM_META = auto()
|
||||
KM_IMAGE = auto()
|
||||
KM_TECKIT = auto()
|
||||
KM_CC = auto()
|
||||
KM_XML = auto()
|
||||
KM_UNKNOWN = auto()
|
||||
|
||||
|
||||
|
|
@ -25,7 +29,8 @@ def print_info(info):
|
|||
print("---- Info ----")
|
||||
print("Name: ", info['name']['description'])
|
||||
print("Copyright: ", info['copyright']['description'])
|
||||
print("Version: ", info['version']['description'])
|
||||
if 'version' in info:
|
||||
print("Version: ", info['version']['description'])
|
||||
if 'author' in info:
|
||||
print("Author: ", info['author']['description'])
|
||||
if 'url' in info['author']:
|
||||
|
|
@ -72,7 +77,8 @@ def print_keyboards(keyboards):
|
|||
for kb in keyboards:
|
||||
print("Keyboard Name: ", kb['name'])
|
||||
print("Keyboard Id: ", kb['id'])
|
||||
print("Keyboard Version: ", kb['version'])
|
||||
if 'version' in kb:
|
||||
print("Keyboard Version: ", kb['version'])
|
||||
if 'oskFont' in kb:
|
||||
print("Keyboard On screen keyboard Font: ", kb['oskFont'])
|
||||
if 'oskFont' in kb:
|
||||
|
|
@ -86,11 +92,12 @@ def print_keyboards(keyboards):
|
|||
print(e) # __str__ allows args to be printed directly, pass
|
||||
pass
|
||||
|
||||
def determine_filetype(filename):
|
||||
def determine_filetype(kblist, filename):
|
||||
"""
|
||||
Determine file type of a filename in a kmp from the extension
|
||||
|
||||
Args:
|
||||
kblist (list): list of keyboard ids
|
||||
filename (str): File name
|
||||
|
||||
Returns:
|
||||
|
|
@ -99,10 +106,14 @@ def determine_filetype(filename):
|
|||
KM_SOURCE: Keyboard source
|
||||
KM_KMX: Compiled keyboard
|
||||
KM_KVK: Compiled on screen keyboard
|
||||
KM_TOUCH: JS touch keyboard
|
||||
KM_FONT: Font
|
||||
KM_DOC: Documentation
|
||||
KM_META: Metadata
|
||||
KM_IMAGE: Image
|
||||
KM_TECKIT: Files to use with teckit
|
||||
KM_CC: Consistent changes tables
|
||||
KM_XML: unspecified xml files
|
||||
KM_UNKNOWN: Unknown
|
||||
"""
|
||||
name, ext = os.path.splitext(filename)
|
||||
|
|
@ -116,11 +127,22 @@ def determine_filetype(filename):
|
|||
return KMFileTypes.KM_KVK
|
||||
elif ext.lower() == ".ttf" or ext.lower() == ".otf":
|
||||
return KMFileTypes.KM_FONT
|
||||
elif ext.lower() == ".js":
|
||||
if kblist is None:
|
||||
return KMFileTypes.KM_UNKNOWN
|
||||
if name in kblist:
|
||||
return KMFileTypes.KM_TOUCH
|
||||
else:
|
||||
if name == "keyrenderer": # currently 2018-09-21 this is the own known non touch js file
|
||||
return KMFileTypes.KM_DOC
|
||||
else:
|
||||
return KMFileTypes.KM_UNKNOWN
|
||||
elif ext.lower() == ".txt" or ext.lower() == ".pdf" or ext.lower() == ".htm" \
|
||||
or ext.lower() == ".html" or ext.lower() == ".doc" or ext.lower() == ".docx" \
|
||||
or ext.lower() == ".css" or ext.lower() == ".chm" or ext.lower() == "" \
|
||||
or ext.lower() == ".md" or ext.lower() == ".odt" or ext.lower() == ".rtf" \
|
||||
or ext.lower() == ".dot":
|
||||
or ext.lower() == ".dot" or ext.lower() == ".mht" or ext.lower() == ".woff" \
|
||||
or ext.lower() == ".php":
|
||||
return KMFileTypes.KM_DOC
|
||||
elif ext.lower() == ".inf" or ext.lower() == ".json":
|
||||
return KMFileTypes.KM_META
|
||||
|
|
@ -128,6 +150,12 @@ def determine_filetype(filename):
|
|||
or ext.lower() == ".jpg" or ext.lower() == ".gif" \
|
||||
or ext.lower() == ".bmp":
|
||||
return KMFileTypes.KM_IMAGE
|
||||
elif ext.lower() == ".tec" or ext.lower() == ".map":
|
||||
return KMFileTypes.KM_TECKIT
|
||||
elif ext.lower() == ".cct":
|
||||
return KMFileTypes.KM_CC
|
||||
elif ext.lower() == ".xml":
|
||||
return KMFileTypes.KM_XML
|
||||
else:
|
||||
return KMFileTypes.KM_UNKNOWN
|
||||
|
||||
|
|
@ -206,7 +234,7 @@ def parseinfdata(inffile, verbose=False):
|
|||
if os.path.isfile(inffile):
|
||||
config = configparser.ConfigParser()
|
||||
config.optionxform = str
|
||||
logging.info("parseinfdata: reading file:%s dir:%s", inffile, extracted_dir)
|
||||
logging.debug("parseinfdata: reading file:%s dir:%s", inffile, extracted_dir)
|
||||
|
||||
with open(inffile, 'r', encoding='latin_1') as f:
|
||||
config.read_file(f)
|
||||
|
|
@ -266,6 +294,10 @@ def parseinfdata(inffile, verbose=False):
|
|||
options['readmeFile'] = item[1]
|
||||
elif item[0] == 'GraphicFile':
|
||||
options['graphicFile'] = item[1]
|
||||
elif item[0] == 'DisableKeepFonts':
|
||||
options['disableKeepFonts'] = item[1]
|
||||
elif item[0] == 'BothVersionsIncluded':
|
||||
options['bothVersionsIncluded'] = item[1]
|
||||
elif item[0] == 'ExecuteProgram':
|
||||
pass
|
||||
else:
|
||||
|
|
@ -300,12 +332,12 @@ def parseinfdata(inffile, verbose=False):
|
|||
files = []
|
||||
for item in config.items(section):
|
||||
splititem = item[1].split("\"")
|
||||
kbfile = { 'name' : splititem[3], 'description' : splititem[1], 'type' : determine_filetype(splititem[3]) }
|
||||
kbfile = { 'name' : splititem[3], 'description' : splititem[1], 'type' : determine_filetype(None, splititem[3]) }
|
||||
files.append(kbfile)
|
||||
elif section == "InstallFiles":
|
||||
files = []
|
||||
for item in config.items(section):
|
||||
kbfile = { 'name' : item[0], 'description' : item[1], 'type' : determine_filetype(item[0]) }
|
||||
kbfile = { 'name' : item[0], 'description' : item[1], 'type' : determine_filetype(None, item[0]) }
|
||||
files.append(kbfile)
|
||||
elif section == 'Install':
|
||||
if not options:
|
||||
|
|
@ -313,6 +345,31 @@ def parseinfdata(inffile, verbose=False):
|
|||
for item in config.items('Install'):
|
||||
if item[0] == 'ReadmeFile':
|
||||
options['readmeFile'] = item[1]
|
||||
kblist = []
|
||||
|
||||
if not info:
|
||||
info = {}
|
||||
if not 'version' in info:
|
||||
info['version'] = { 'description' : "1.0" }
|
||||
# inf file may not have keyboards in legacy kmps so generate it if needed
|
||||
if files and not keyboards:
|
||||
id = "unknown"
|
||||
keyboards = []
|
||||
for kbfile in files:
|
||||
if kbfile['type'] == KMFileTypes.KM_KMX:
|
||||
id = os.path.basename(os.path.splitext(kbfile['name'])[0])
|
||||
keyboards = [ { 'name' : id,
|
||||
'id' : id,
|
||||
'version' : info['version']['description'] } ]
|
||||
|
||||
kblist = []
|
||||
if files:
|
||||
for k in keyboards:
|
||||
kblist.append(k['id'])
|
||||
for kbfile in files:
|
||||
if kbfile['type'] == KMFileTypes.KM_UNKNOWN:
|
||||
kbfile['type'] = determine_filetype(kblist, kbfile['name'])
|
||||
logging.debug("finished parsing %s", inffile)
|
||||
|
||||
if verbose:
|
||||
print_info(info)
|
||||
|
|
@ -364,6 +421,8 @@ def parsemetadata(jsonfile, verbose=False):
|
|||
info = system = keyboards = files = options = nonexistent = None
|
||||
extracted_dir = os.path.dirname(jsonfile)
|
||||
|
||||
logging.debug("parsemetadata: reading file:%s dir:%s", jsonfile, extracted_dir)
|
||||
|
||||
if os.path.isfile(jsonfile):
|
||||
with open(jsonfile, "r") as read_file:
|
||||
data = json.load(read_file)
|
||||
|
|
@ -376,12 +435,15 @@ def parsemetadata(jsonfile, verbose=False):
|
|||
keyboards = data[x]
|
||||
elif x == 'files':
|
||||
files = data[x]
|
||||
for kbfile in files:
|
||||
kbfile['type'] = determine_filetype(kbfile['name'])
|
||||
elif x == 'options':
|
||||
options = data[x]
|
||||
elif x == 'nonexistent':
|
||||
nonexistent = data[x]
|
||||
kblist = []
|
||||
for k in keyboards:
|
||||
kblist.append(k['id'])
|
||||
for kbfile in files:
|
||||
kbfile['type'] = determine_filetype(kblist, kbfile['name'])
|
||||
if nonexistent != None:
|
||||
logging.warning("This should not happen")
|
||||
if verbose:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue