def convert(input_svg_path, rotation_x, rotation_y, ns_registry_lock): assert isinstance(input_svg_path, (str, unicode)) assert os.path.splitext(input_svg_path)[1] == ".svg" input_file_name = os.path.splitext(input_svg_path)[0] output_png_path = "{}_rotX_{}_rotY_{}.png".format(input_file_name, rotation_x, rotation_y) _log.info(" converting '%s' to Pocket Code compatible png '%s'", input_svg_path, output_png_path) output_svg_path = input_svg_path.replace(".svg", "_modified.svg") output_svg_URI = Paths.get(output_svg_path).toUri().toURL().toString() if os.path.exists(output_png_path): _log.error(" '%s' already exists", output_png_path) #assert False # "Still a Duplicate?" # remove temporary files if os.path.exists(output_svg_path): os.remove(output_svg_path) return output_png_path # avoid duplicate conversions! png_ostream = None error = None try: _parse_and_rewrite_svg_file(input_svg_path, output_svg_path, ns_registry_lock) command = "svg2png" out = subprocess.check_output([command, output_svg_path, "-o", output_png_path]) _log.info(" converting '%s' to Pocket Code compatible png '%s'", input_svg_path, output_png_path) assert os.path.exists(output_png_path) final_image = _translation(output_png_path, rotation_x, rotation_y) if final_image is None: raise RuntimeError("...") from javax.imageio import ImageIO from java.io import File ImageIO.write(final_image, "PNG", File(output_png_path)) return output_png_path except BaseException as err: import traceback import sys exc_info = sys.exc_info() _log.error(err) _log.error(traceback.format_exc()) _log.error(exc_info) error = common.ScratchtobatError("SVG to PNG conversion call failed for: %s" % input_svg_path) finally: # free resources if png_ostream != None: png_ostream.flush() png_ostream.close() # remove temporary files if os.path.exists(output_svg_path): os.remove(output_svg_path) if error != None: raise error
def convert(input_svg_path, rotation_x, rotation_y): assert isinstance(input_svg_path, (str, unicode)) assert os.path.splitext(input_svg_path)[1] == ".svg" input_file_name = os.path.splitext(input_svg_path)[0] output_png_path = "{}_rotX_{}_rotY_{}.png".format(input_file_name, rotation_x, rotation_y) _log.info(" converting '%s' to Pocket Code compatible png '%s'", input_svg_path, output_png_path) output_svg_path = input_svg_path.replace(".svg", "_modified.svg") output_svg_URI = Paths.get(output_svg_path).toUri().toURL().toString() if os.path.exists(output_png_path): _log.info(" nothing to do: '%s' already exists", output_png_path) # remove temporary files if os.path.exists(output_svg_path): os.remove(output_svg_path) return output_png_path # avoid duplicate conversions! png_ostream = None error = None try: _parse_and_rewrite_svg_file(input_svg_path, output_svg_path) input_svg_image = TranscoderInput(output_svg_URI) output_png_image = TranscoderOutput(FileOutputStream(output_png_path)) _log.info(" converting '%s' to Pocket Code compatible png '%s'", input_svg_path, output_png_path) png_converter = PNGTranscoder() png_converter.transcode(input_svg_image, output_png_image) assert os.path.exists(output_png_path) # TODO: uncomment this once all remaining bugs have been fixed! final_image = _translation(output_png_path, rotation_x, rotation_y) if final_image is None: raise RuntimeError("...") from javax.imageio import ImageIO from java.io import File ImageIO.write(final_image, "PNG", File(output_png_path)) return output_png_path except BaseException as err: import traceback import sys exc_info = sys.exc_info() _log.error(err) _log.error(traceback.format_exc()) _log.error(exc_info) error = common.ScratchtobatError( "PNG to SVG conversion call failed for: %s" % input_svg_path) finally: # free resources if png_ostream != None: png_ostream.flush() png_ostream.close() # remove temporary files if os.path.exists(output_svg_path): os.remove(output_svg_path) if error != None: raise error
def run_converter(scratch_project_file_or_url, output_dir, extract_resulting_catrobat=False, temp_rm=True, show_version_only=False, show_info_only=False, archive_name=None, web_mode=False): def check_base_environment(): if "java" not in sys.platform: raise EnvironmentError("Must be called with Jython interpreter.") if System.getProperty(helpers.JYTHON_RESPECT_JAVA_ACCESSIBILITY_PROPERTY) != 'false': raise EnvironmentError("Jython registry property '%s' must be set to 'false'." % helpers.JYTHON_RESPECT_JAVA_ACCESSIBILITY_PROPERTY) def check_converter_environment(): # TODO: refactor to combined class with explicit environment check method tools.svgtopng._checked_batik_jar_path() tools.wavconverter._checked_sox_path() try: from java.io import IOError from java.lang import System except ImportError: log.error("Must be called with Jython interpreter.") return helpers.ExitCode.FAILURE # nested import to be able to check for Jython interpreter first from scratchtocatrobat import tools from scratchtocatrobat.tools import common from scratchtocatrobat.converter import converter, catrobat from scratchtocatrobat.scratch import scratchwebapi, scratch try: check_base_environment() check_converter_environment() catrobat_language_version_from_config = float(helpers.catrobat_info("catrobat_language_version")) if catrobat_language_version_from_config != catrobat.CATROBAT_LANGUAGE_VERSION: raise RuntimeError("Wrong Catrobat Language version set in config-file! " \ "Catrobat language version is %.3f but should be %.3f! Please update!" % (catrobat_language_version_from_config, catrobat.CATROBAT_LANGUAGE_VERSION)) tag_name = helpers.tag_name_of_used_catroid_hierarchy() latest_release_data = helpers.latest_catroid_repository_release_data() if show_version_only or show_info_only: helpers.print_info_or_version_screen(show_version_only, catrobat.CATROBAT_LANGUAGE_VERSION) return helpers.ExitCode.SUCCESS elif latest_release_data and not web_mode: # suppress release-reminder in web-mode current_release_version = helpers.extract_version_number(tag_name) latest_release_version = helpers.extract_version_number(latest_release_data["tag_name"]) if current_release_version < latest_release_version: print("Latest Catroid release: %s (%s)" % (latest_release_data["tag_name"], latest_release_data["published_at"])) print("%sA NEW CATROID RELEASE IS AVAILABLE!\nPLEASE UPDATE THE CLASS HIERARCHY " \ "OF THE CONVERTER FROM CATROID VERSION %s TO VERSION %s%s" % ( helpers.cli_colors.FAIL, tag_name, latest_release_data["tag_name"], helpers.cli_colors.ENDC )) log.info("calling converter") if not os.path.isdir(output_dir): raise EnvironmentError("Output folder must be a directory, but is %s" % output_dir) scratch3ProjectName = "Untitled" progress_bar = helpers.ProgressBar(None, web_mode, sys.stdout) with common.TemporaryDirectory(remove_on_exit=temp_rm) as scratch_project_dir: is_local_project = True project_id = None if scratch_project_file_or_url.startswith("https://"): is_local_project = False validate_scratch_url(scratch_project_file_or_url) project_id = scratchwebapi.extract_project_id_from_url(scratch_project_file_or_url) if not scratchwebapi.request_is_project_available(project_id): raise common.ScratchtobatError("Project with ID %s not available" % project_id) visibility = scratchwebapi.getMetaDataEntry(project_id, "visibility") if visibility != scratchwebapi.ScratchProjectVisibiltyState.PUBLIC: log.warn('-'*80) log.warn("CAVE: Project with ID %s is NOT a public project!! Trying to " \ "continue the conversion-process anyway, but expecting the " \ "conversion to fail or to be incomplete...", project_id) log.warn('-'*80) log.info("Downloading project from URL: '{}' to temp dir {} ...".format( scratch_project_file_or_url, scratch_project_dir)) scratchwebapi.download_project(scratch_project_file_or_url, scratch_project_dir, progress_bar) scratch3ProjectName = scratchwebapi.getMetaDataEntry(project_id, "title") elif os.path.isfile(scratch_project_file_or_url): log.info("Extracting project from path: '{}' ...".format(scratch_project_file_or_url)) common.extract(scratch_project_file_or_url, scratch_project_dir) else: if not os.path.isdir(scratch_project_file_or_url): raise common.ScratchtobatError("Directory of local project not found in %s" % scratch_project_file_or_url) log.info("Loading project from path: '{}' ...".format(scratch_project_file_or_url)) scratch_project_dir = scratch_project_file_or_url isScratch3Project = scratch3.is_scratch3_project(scratch_project_dir) if isScratch3Project: scratch3.convert_to_scratch2_data(scratch_project_dir, project_id) project = scratch.Project(scratch_project_dir, progress_bar=progress_bar, is_local_project = is_local_project) if isScratch3Project: project.name = scratch3ProjectName log.info("Converting scratch project '%s' into output folder: %s", project.name, output_dir) context = converter.Context() converted_project = converter.converted(project, progress_bar, context) catrobat_program_path = converted_project.save_as_catrobat_package_to(output_dir, archive_name, progress_bar, context) if extract_resulting_catrobat: extraction_path = os.path.join(output_dir, os.path.splitext(os.path.basename(catrobat_program_path))[0]) common.rm_dir(extraction_path) common.makedirs(extraction_path) scratch_output_path = os.path.join(extraction_path, "scratch") common.copy_dir(scratch_project_dir, scratch_output_path, overwrite=True) common.extract(catrobat_program_path, extraction_path) progress_bar.finish() except (common.ScratchtobatError, EnvironmentError, IOError) as e: log.error(e) return helpers.ExitCode.FAILURE except Exception as e: log.exception(e) return helpers.ExitCode.FAILURE return helpers.ExitCode.SUCCESS