Přidána podpora pro asymptote. Stejně jako PDF se z nich v HTML výstupu nyní generují SVG. (Resolved #12) #5.
This commit is contained in:
		
							parent
							
								
									f63ed7b56a
								
							
						
					
					
						commit
						89fa5e3416
					
				
					 4 changed files with 39 additions and 6 deletions
				
			
		|  | @ -138,10 +138,11 @@ class HTMLGenerator(OutputGenerator): | ||||||
| 			# processing contains finding and moving them to the output | 			# processing contains finding and moving them to the output | ||||||
| 			# directory. | 			# directory. | ||||||
| 			url = self.imageProcessor.process_image(url, ext, source_dir, **additional_args) | 			url = self.imageProcessor.process_image(url, ext, source_dir, **additional_args) | ||||||
| 		elif ext in ["pdf", "epdf"]: | 		elif ext in ["pdf", "epdf","asy"]: | ||||||
| 			if not "dpi" in additional_args: | 			# Only relevant for when these were PNGs, leaving this here for future reference. | ||||||
| 				additional_args["dpi"] = 300 | 			# if not "dpi" in additional_args: | ||||||
| 			url = self.imageProcessor.process_image(url, "png", source_dir, **additional_args) | 			#	additional_args["dpi"] = 300 | ||||||
|  | 			url = self.imageProcessor.process_image(url, "svg", source_dir, **additional_args) | ||||||
| 		elif ext in ["jpg"]: | 		elif ext in ["jpg"]: | ||||||
| 			url = self.imageProcessor.process_image(url, "jpeg", source_dir, **additional_args) | 			url = self.imageProcessor.process_image(url, "jpeg", source_dir, **additional_args) | ||||||
| 		else: | 		else: | ||||||
|  |  | ||||||
|  | @ -7,12 +7,20 @@ from PIL import Image | ||||||
| class FileInWrongDirError(Exception): | class FileInWrongDirError(Exception): | ||||||
| 	pass | 	pass | ||||||
| 
 | 
 | ||||||
| class InkscapeError(Exception): | class ConversionProgramError(Exception): | ||||||
| 	pass | 	pass | ||||||
| 
 | 
 | ||||||
| class ImageMagickError(Exception): | class InkscapeError(ConversionProgramError): | ||||||
| 	pass | 	pass | ||||||
| 
 | 
 | ||||||
|  | class ImageMagickError(ConversionProgramError): | ||||||
|  | 	pass | ||||||
|  | 
 | ||||||
|  | class AsyError(ConversionProgramError): | ||||||
|  | 	pass | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class ImageProcessor: | class ImageProcessor: | ||||||
| 	def __init__(self, public_dir: str, web_path: str, cache_dir: str, *lookup_dirs: list[str]): | 	def __init__(self, public_dir: str, web_path: str, cache_dir: str, *lookup_dirs: list[str]): | ||||||
| 		self.public_dir = public_dir | 		self.public_dir = public_dir | ||||||
|  | @ -32,6 +40,9 @@ class ImageProcessor: | ||||||
| 		if full_path is None: | 		if full_path is None: | ||||||
| 			raise FileNotFoundError(f'Image {input_filename} not found in {self.lookup_dirs} or {source_dir}.') | 			raise FileNotFoundError(f'Image {input_filename} not found in {self.lookup_dirs} or {source_dir}.') | ||||||
| 
 | 
 | ||||||
|  | 		if format == "jpg": | ||||||
|  | 			format = "jpeg" | ||||||
|  | 
 | ||||||
| 		# Locate all dependencies | 		# Locate all dependencies | ||||||
| 		deps_full = [full_path] | 		deps_full = [full_path] | ||||||
| 		for dep in deps: | 		for dep in deps: | ||||||
|  | @ -67,6 +78,21 @@ class ImageProcessor: | ||||||
| 			elif self.find_image(target_name, [source_dir]) is not None and not self.is_outdated(self.find_image(target_name, [source_dir]), deps): | 			elif self.find_image(target_name, [source_dir]) is not None and not self.is_outdated(self.find_image(target_name, [source_dir]), deps): | ||||||
| 				shutil.copyfile(self.find_image(target_name, [source_dir]), target_path) | 				shutil.copyfile(self.find_image(target_name, [source_dir]), target_path) | ||||||
| 
 | 
 | ||||||
|  | 			# Process asymptote | ||||||
|  | 			elif ext == "asy": | ||||||
|  | 				# Collect dependencies | ||||||
|  | 				deps_dir = self.cache_dir + "/" + name + "_deps" | ||||||
|  | 				if not os.path.isdir(deps_dir): | ||||||
|  | 					os.mkdir(deps_dir) | ||||||
|  | 				for dep_full in deps_full: | ||||||
|  | 					dep = os.path.basename(dep_full) | ||||||
|  | 					if not os.path.isfile(deps_dir + "/" + dep) or os.path.getmtime(deps_dir + "/" + dep) < os.path.getmtime(dep_full): | ||||||
|  | 						shutil.copyfile(dep_full, deps_dir + "/" + dep) | ||||||
|  | 				dpi_arg = ['-render', str(dpi/72)] if dpi is not None else [] | ||||||
|  | 				if subprocess.run(['asy', name, '-o', target_name, '-f', format, *dpi_arg], cwd=deps_dir).returncode != 0: | ||||||
|  | 					raise AsyError(f"Could not convert '{full_path}' to '{format}'") | ||||||
|  | 				shutil.move(deps_dir + "/" + target_name, self.cache_dir + "/" + target_name) | ||||||
|  | 
 | ||||||
| 			# Convert SVGs using inkscape | 			# Convert SVGs using inkscape | ||||||
| 			elif ext == "svg": | 			elif ext == "svg": | ||||||
| 				width_arg = ['--export-width', str(width)] if width is not None else [] | 				width_arg = ['--export-width', str(width)] if width is not None else [] | ||||||
|  | @ -125,3 +151,6 @@ class ImageProcessor: | ||||||
| 		for dir in [*self.lookup_dirs, *additional_dirs]: | 		for dir in [*self.lookup_dirs, *additional_dirs]: | ||||||
| 			if os.path.isfile(dir + "/" + input_filename): | 			if os.path.isfile(dir + "/" + input_filename): | ||||||
| 				return dir + "/" + input_filename | 				return dir + "/" + input_filename | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								test/test-files/circle.asy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								test/test-files/circle.asy
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | ||||||
|  | import graph; | ||||||
|  | draw(Circle((0,0),20)); // graph - Circle | ||||||
|  | @ -48,6 +48,7 @@ I am a duck. | ||||||
| This should be only shown to included cats. | This should be only shown to included cats. | ||||||
| ::: | ::: | ||||||
| 
 | 
 | ||||||
|  | {width=50px} | ||||||
| 
 | 
 | ||||||
| $$ | $$ | ||||||
| \def\eqalign#1{NO, just, nooooo} | \def\eqalign#1{NO, just, nooooo} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue