Example #1
0
def download_source(keyboardID, packageDir, sourcePath):
	# just get latest version of kmn unless there turns out to be a way to get the version of a file at a date
	base_url = "https://raw.github.com/keymanapp/keyboards/master/" + sourcePath
	kmn_url = base_url + "/source/" + keyboardID + ".kmn"
	response = requests.get(kmn_url)
	if response.status_code == 200:
		kmn_file = os.path.join(packageDir, keyboardID + ".kmn")
		with open(kmn_file, 'wb') as f:
			f.write(response.content)
			logging.info("Installing %s.kmn as keyman file", keyboardID)
		logging.info("Compiling kmn file")
		subprocess.run(["kmflcomp", kmn_file], stdout=subprocess.PIPE, stderr= subprocess.STDOUT)
		# kmfl_file = os.path.join(kbdir, kbid + ".kmfl")
		# if not os.path.isfile(kmfl_file):
		# 	message = "Could not compile %s to %s so not installing keyboard." % (kmn_file, kmfl_file)
		# 	os.remove(kmn_file)
		# 	rmtree(kbdir)
		# 	raise InstallError(InstallStatus.Abort, message)
	# else:
	# 	message = "install_kmp.py: warning: no kmn source file for %s so not installing keyboard." % (kbid)
	# 	rmtree(kbdir)
	# 	raise InstallError(InstallStatus.Abort, message)
	icodownloadfile = os.path.join(packageDir, keyboardID + ".ico")
	if not os.path.isfile(icodownloadfile):
		ico_url = base_url + "/source/" + keyboardID + ".ico"
		response = requests.get(ico_url)
		if response.status_code == 200:
			with open(icodownloadfile, 'wb') as f:
				f.write(response.content)
			logging.info("Installing %s.ico as keyman file", keyboardID)
			checkandsaveico(icodownloadfile)
		else:
			logging.warning("install_kmp.py: warning: no ico source file for %s", keyboardID)
Example #2
0
def install_kmp_user(inputfile, online=False):
	packageID = extract_package_id(inputfile)
	packageDir=user_keyboard_dir(packageID)
	if not os.path.isdir(packageDir):
		os.makedirs(packageDir)

	extract_kmp(inputfile, packageDir)
	#restart IBus so it knows about the keyboards being installed
	restart_ibus()
	info, system, options, keyboards, files = get_metadata(packageDir)

	if keyboards:
		logging.info("Installing %s", info['name']['description'])
		if online:
			process_keyboard_data(packageID, packageDir)
			if len(keyboards) > 1:
				for kb in keyboards:
					if kb['id'] != packageID:
						process_keyboard_data(kb['id'], packageDir)

		for f in files:
			fpath = os.path.join(packageDir, f['name'])
			ftype = f['type']
			if ftype == KMFileTypes.KM_FONT:
				#Special handling of font to hard link it into font dir
				fontsdir = os.path.join(user_keyman_font_dir(), packageID)
				if not os.path.isdir(fontsdir):
					os.makedirs(fontsdir)
				os.link(fpath, os.path.join(fontsdir, f['name']))
				logging.info("Installing %s as font", f['name'])
			elif ftype == KMFileTypes.KM_OSK:
				# Special handling to convert kvk into LDML
				logging.info("Converting %s to LDML and installing both as as keyman file", f['name'])
				ldml = convert_kvk_to_ldml(fpath)
				name, ext = os.path.splitext(f['name'])
				ldmlfile = os.path.join(packageDir, name+".ldml")
				output_ldml(ldmlfile, ldml)
			elif ftype == KMFileTypes.KM_ICON:
				# Special handling of icon to convert to PNG
				logging.info("Converting %s to PNG and installing both as keyman files", f['name'])
				checkandsaveico(fpath)
			elif ftype == KMFileTypes.KM_SOURCE:
				#TODO for the moment just leave it for ibus-kmfl to ignore if it doesn't load
				pass
			elif ftype == KMFileTypes.KM_KMX:
				# Sanitize keyboard filename if not lower case
				kmx_id, ext = os.path.splitext(os.path.basename(f['name']))
				for kb in keyboards:
					if kmx_id.lower() == kb['id'] and kmx_id != kb['id']:
						os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx'))

		install_keyboards_to_ibus(keyboards, packageDir)
	else:
		logging.error("install_kmp.py: error: No kmp.json or kmp.inf found in %s", inputfile)
		logging.info("Contents of %s:", inputfile)
		for o in os.listdir(packageDir):
			logging.info(o)
		rmtree(packageDir)
		message = "install_kmp.py: error: No kmp.json or kmp.inf found in %s" % (inputfile)
		raise InstallError(InstallStatus.Abort, message)
Example #3
0
def download_source(keyboardID, packageDir, sourcePath):
    # just get latest version of kmn unless there turns out to be a way to get the version of a file at a date
    base_url = "https://raw.github.com/keymanapp/keyboards/master/" + sourcePath
    kmn_url = base_url + "/source/" + keyboardID + ".kmn"
    response = requests.get(kmn_url)
    if response.status_code == 200:
        kmn_file = os.path.join(packageDir, keyboardID + ".kmn")
        with open(kmn_file, 'wb') as f:
            f.write(response.content)
            logging.info("Installing %s.kmn as keyman file", keyboardID)
        logging.info("Compiling kmn file")
        subprocess.run(["kmflcomp", kmn_file],
                       stdout=subprocess.PIPE,
                       stderr=subprocess.STDOUT)
        # kmfl_file = os.path.join(kbdir, kbid + ".kmfl")
        # if not os.path.isfile(kmfl_file):
        # 	message = "Could not compile %s to %s so not installing keyboard." % (kmn_file, kmfl_file)
        # 	os.remove(kmn_file)
        # 	rmtree(kbdir)
        # 	raise InstallError(InstallStatus.Abort, message)
    # else:
    # 	message = "install_kmp.py: warning: no kmn source file for %s so not installing keyboard." % (kbid)
    # 	rmtree(kbdir)
    # 	raise InstallError(InstallStatus.Abort, message)
    icodownloadfile = os.path.join(packageDir, keyboardID + ".ico")
    if not os.path.isfile(icodownloadfile):
        ico_url = base_url + "/source/" + keyboardID + ".ico"
        response = requests.get(ico_url)
        if response.status_code == 200:
            with open(icodownloadfile, 'wb') as f:
                f.write(response.content)
            logging.info("Installing %s.ico as keyman file", keyboardID)
            checkandsaveico(icodownloadfile)
        else:
            logging.warning(
                "install_kmp.py: warning: no ico source file for %s",
                keyboardID)
Example #4
0
def install_kmp_shared(inputfile, online=False, language=None):
    """
    Install a kmp file to /usr/local/share/keyman

    Args:
        inputfile (str): path to kmp file
        online (bool, default=False): whether to attempt to get online keyboard data
    """
    check_keyman_dir(
        '/usr/local/share',
        _("You do not have permissions to install the keyboard files to the shared area "
          "/usr/local/share/keyman"))
    check_keyman_dir(
        '/usr/local/share/doc',
        _("You do not have permissions to install the documentation to the shared "
          "documentation area /usr/local/share/doc/keyman"))
    check_keyman_dir(
        '/usr/local/share/fonts',
        _("You do not have permissions to install the font files to the shared font area "
          "/usr/local/share/fonts"))

    packageID = extract_package_id(inputfile)
    packageDir = os.path.join('/usr/local/share/keyman', packageID)
    kmpdocdir = os.path.join('/usr/local/share/doc/keyman', packageID)
    kmpfontdir = os.path.join('/usr/local/share/fonts/keyman', packageID)
    if not os.path.isdir(packageDir):
        os.makedirs(packageDir)
    extract_kmp(inputfile, packageDir)
    # restart IBus so it knows about the keyboards being installed
    logging.debug("restarting IBus")
    restart_ibus()
    info, system, options, keyboards, files = get_metadata(packageDir)

    if keyboards:
        logging.info("Installing %s", info['name']['description'])
        if online:
            process_keyboard_data(packageID, packageDir)
            if len(keyboards) > 1:
                for kb in keyboards:
                    if kb['id'] != packageID:
                        process_keyboard_data(kb['id'], packageDir)

        for f in files:
            fpath = os.path.join(packageDir, f['name'])
            ftype = f['type']
            if ftype == KMFileTypes.KM_DOC or ftype == KMFileTypes.KM_IMAGE:
                # Special handling of doc and images to hard link them into doc dir
                logging.info("Installing %s as documentation", f['name'])
                if not os.path.isdir(kmpdocdir):
                    os.makedirs(kmpdocdir)
                os.link(fpath, os.path.join(kmpdocdir, f['name']))
            elif ftype == KMFileTypes.KM_FONT:
                # Special handling of font to hard link it into font dir
                logging.info("Installing %s as font", f['name'])
                if not os.path.isdir(kmpfontdir):
                    os.makedirs(kmpfontdir)
                os.link(fpath, os.path.join(kmpfontdir, f['name']))
            elif ftype == KMFileTypes.KM_SOURCE:
                # TODO for the moment just leave it for ibus-kmfl to ignore if it doesn't load
                logging.info("Installing %s as keyman file", f['name'])
            elif ftype == KMFileTypes.KM_OSK:
                # Special handling to convert kvk into LDML
                logging.info(
                    "Converting %s to LDML and installing both as as keyman file",
                    f['name'])
                ldml = convert_kvk_to_ldml(fpath)
                name, ext = os.path.splitext(f['name'])
                ldmlfile = os.path.join(packageDir, name + ".ldml")
                output_ldml(ldmlfile, ldml)
            elif ftype == KMFileTypes.KM_ICON:
                # Special handling of icon to convert to PNG
                logging.info(
                    "Converting %s to PNG and installing both as keyman files",
                    f['name'])
                checkandsaveico(fpath)
            elif ftype == KMFileTypes.KM_KMX:
                # Sanitize keyboard filename if not lower case
                kmx_id, ext = os.path.splitext(os.path.basename(f['name']))
                for kb in keyboards:
                    if kmx_id.lower() == kb['id'] and kmx_id != kb['id']:
                        os.rename(os.path.join(packageDir, f['name']),
                                  os.path.join(packageDir, kb['id'] + '.kmx'))
                        fpath = os.path.join(packageDir, kb['id'] + '.kmx')
                extractico(fpath)

        install_keyboards_to_ibus(keyboards, packageDir, language)
    else:
        logging.error(
            "install_kmp.py: error: No kmp.json or kmp.inf found in %s",
            inputfile)
        logging.info("Contents of %s:", inputfile)
        for o in os.listdir(packageDir):
            logging.info(o)
        rmtree(packageDir)
        message = _(
            "install_kmp.py: error: No kmp.json or kmp.inf found in {package}"
        ).format(package=inputfile)
        raise InstallError(InstallStatus.Abort, message)
Example #5
0
def install_kmp_user(inputfile, online=False, language=None):
    packageID = extract_package_id(inputfile)
    packageDir = user_keyboard_dir(packageID)
    if not os.path.isdir(packageDir):
        os.makedirs(packageDir)

    extract_kmp(inputfile, packageDir)
    restart_ibus()

    info, system, options, keyboards, files = get_metadata(packageDir)

    if keyboards:
        logging.info("Installing %s", info['name']['description'])
        if online:
            process_keyboard_data(packageID, packageDir)
            if len(keyboards) > 1:
                for kb in keyboards:
                    if kb['id'] != packageID:
                        process_keyboard_data(kb['id'], packageDir)

        for f in files:
            fpath = os.path.join(packageDir, f['name'])
            ftype = f['type']
            if ftype == KMFileTypes.KM_FONT:
                # Special handling of font to hard link it into font dir
                fontsdir = os.path.join(user_keyman_font_dir(), packageID)
                if not os.path.isdir(fontsdir):
                    os.makedirs(fontsdir)
                os.link(fpath, os.path.join(fontsdir, f['name']))
                logging.info("Installing %s as font", f['name'])
            elif ftype == KMFileTypes.KM_OSK:
                # Special handling to convert kvk into LDML
                logging.info(
                    "Converting %s to LDML and installing both as as keyman file",
                    f['name'])
                ldml = convert_kvk_to_ldml(fpath)
                name, ext = os.path.splitext(f['name'])
                ldmlfile = os.path.join(packageDir, name + ".ldml")
                output_ldml(ldmlfile, ldml)
            elif ftype == KMFileTypes.KM_ICON:
                # Special handling of icon to convert to PNG
                logging.info(
                    "Converting %s to PNG and installing both as keyman files",
                    f['name'])
                checkandsaveico(fpath)
            elif ftype == KMFileTypes.KM_SOURCE:
                # TODO for the moment just leave it for ibus-kmfl to ignore if it doesn't load
                pass
            elif ftype == KMFileTypes.KM_KMX:
                # Sanitize keyboard filename if not lower case
                kmx_id, ext = os.path.splitext(os.path.basename(f['name']))
                for kb in keyboards:
                    if kmx_id.lower() == kb['id'] and kmx_id != kb['id']:
                        os.rename(os.path.join(packageDir, f['name']),
                                  os.path.join(packageDir, kb['id'] + '.kmx'))
                        fpath = os.path.join(packageDir, kb['id'] + '.kmx')
                extractico(fpath)

        install_keyboards(keyboards, packageDir, language)
    else:
        logging.error(
            "install_kmp.py: error: No kmp.json or kmp.inf found in %s",
            inputfile)
        logging.info("Contents of %s:", inputfile)
        for o in os.listdir(packageDir):
            logging.info(o)
        rmtree(packageDir)
        message = _(
            "install_kmp.py: error: No kmp.json or kmp.inf found in {packageFile}"
        ).format(packageFile=inputfile)
        raise InstallError(InstallStatus.Abort, message)
Example #6
0
def install_kmp_shared(inputfile, online=False):
	"""
	Install a kmp file to /usr/local/share/keyman

	Args:
		inputfile (str): path to kmp file
		online(bool, default=False): whether to attempt to get a source kmn and ico for the keyboard
	"""
	check_keyman_dir('/usr/local/share', "You do not have permissions to install the keyboard files to the shared area /usr/local/share/keyman")
	check_keyman_dir('/usr/local/share/doc', "You do not have permissions to install the documentation to the shared documentation area /usr/local/share/doc/keyman")
	check_keyman_dir('/usr/local/share/fonts', "You do not have permissions to install the font files to the shared font area /usr/local/share/fonts")

	packageID = extract_package_id(inputfile)
	packageDir = os.path.join('/usr/local/share/keyman', packageID)
	kmpdocdir = os.path.join('/usr/local/share/doc/keyman', packageID)
	kmpfontdir = os.path.join('/usr/local/share/fonts/keyman', packageID)
	if not os.path.isdir(packageDir):
		os.makedirs(packageDir)
	extract_kmp(inputfile, packageDir)
	#restart IBus so it knows about the keyboards being installed
	logging.debug("restarting IBus")
	restart_ibus()
	info, system, options, keyboards, files = get_metadata(packageDir)

	if keyboards:
		logging.info("Installing %s", info['name']['description'])
		if online:
			process_keyboard_data(packageID, packageDir)
			if len(keyboards) > 1:
				for kb in keyboards:
					if kb['id'] != packageID:
						process_keyboard_data(kb['id'], packageDir)

		for f in files:
			fpath = os.path.join(packageDir, f['name'])
			ftype = f['type']
			if ftype == KMFileTypes.KM_DOC or ftype == KMFileTypes.KM_IMAGE:
				#Special handling of doc and images to hard link them into doc dir
				logging.info("Installing %s as documentation", f['name'])
				if not os.path.isdir(kmpdocdir):
					os.makedirs(kmpdocdir)
				os.link(fpath, os.path.join(kmpdocdir, f['name']))
			elif ftype == KMFileTypes.KM_FONT:
				#Special handling of font to hard link it into font dir
				logging.info("Installing %s as font", f['name'])
				if not os.path.isdir(kmpfontdir):
					os.makedirs(kmpfontdir)
				os.link(fpath, os.path.join(kmpfontdir, f['name']))
			elif ftype == KMFileTypes.KM_SOURCE:
				#TODO for the moment just leave it for ibus-kmfl to ignore if it doesn't load
				logging.info("Installing %s as keyman file", f['name'])
			elif ftype == KMFileTypes.KM_OSK:
				# Special handling to convert kvk into LDML
				logging.info("Converting %s to LDML and installing both as as keyman file", f['name'])
				ldml = convert_kvk_to_ldml(fpath)
				name, ext = os.path.splitext(f['name'])
				ldmlfile = os.path.join(packageDir, name+".ldml")
				output_ldml(ldmlfile, ldml)
			elif ftype == KMFileTypes.KM_ICON:
				# Special handling of icon to convert to PNG
				logging.info("Converting %s to PNG and installing both as keyman files", f['name'])
				checkandsaveico(fpath)
			elif ftype == KMFileTypes.KM_KMX:
				# Sanitize keyboard filename if not lower case
				kmx_id, ext = os.path.splitext(os.path.basename(f['name']))
				for kb in keyboards:
					if kmx_id.lower() == kb['id'] and kmx_id != kb['id']:
						os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx'))

		for kb in keyboards:
			# install all kmx for first lang not just packageID
			kmx_file = os.path.join(packageDir, kb['id'] + ".kmx")
			install_to_ibus(lang, kmx_file)
	else:
		logging.error("install_kmp.py: error: No kmp.json or kmp.inf found in %s", inputfile)
		logging.info("Contents of %s:", inputfile)
		for o in os.listdir(packageDir):
			logging.info(o)
		rmtree(packageDir)
		message = "install_kmp.py: error: No kmp.json or kmp.inf found in %s" % (inputfile)
		raise InstallError(InstallStatus.Abort, message)