366 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			366 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								import sys.FileSystem;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class PathManager
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   private static var directoryCache = new Map<String,Bool>();
							 | 
						||
| 
								 | 
							
								   private static var haxelibPaths = new Map<String,String>();
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   public static function combine(firstPath:String, secondPath:String):String
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      if (firstPath == null || firstPath == "")
							 | 
						||
| 
								 | 
							
								      {   
							 | 
						||
| 
								 | 
							
								         return secondPath;  
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else if (secondPath != null && secondPath != "" && secondPath!=".")
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (BuildTool.isWindows)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            if (secondPath.indexOf (":") == 1)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               return secondPath;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         else
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            if (secondPath.substr (0, 1) == "/")
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               return secondPath;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         var firstSlash = (firstPath.substr(-1) == "/" || firstPath.substr(-1) == "\\");
							 | 
						||
| 
								 | 
							
								         var secondSlash = (secondPath.substr(0, 1) == "/" || secondPath.substr(0, 1) == "\\");
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         if (firstSlash && secondSlash)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            return firstPath + secondPath.substr(1);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         else if (!firstSlash && !secondSlash)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            return firstPath + "/" + secondPath;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         else
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            return firstPath + secondPath;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return firstPath;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								   public static function escape(path:String):String
							 | 
						||
| 
								 | 
							
								   {  
							 | 
						||
| 
								 | 
							
								      if (!BuildTool.isWindows)
							 | 
						||
| 
								 | 
							
								      {  
							 | 
						||
| 
								 | 
							
								         path = StringTools.replace(path, "\\ ", " ");
							 | 
						||
| 
								 | 
							
								         path = StringTools.replace(path, " ", "\\ ");
							 | 
						||
| 
								 | 
							
								         path = StringTools.replace(path, "\\'", "'");
							 | 
						||
| 
								 | 
							
								         path = StringTools.replace(path, "'", "\\'");   
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {  
							 | 
						||
| 
								 | 
							
								         path = StringTools.replace(path, "^,", ",");
							 | 
						||
| 
								 | 
							
								         path = StringTools.replace(path, ",", "^,"); 
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return expand(path);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function expand(path:String):String
							 | 
						||
| 
								 | 
							
								   {  
							 | 
						||
| 
								 | 
							
								      if (path == null)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         path = "";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      if (!BuildTool.isWindows)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (StringTools.startsWith(path, "~/"))
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            path = Sys.getEnv("HOME") + "/" + path.substr(2);  
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      return path;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function getHaxelib (haxelib:String, version:String = "", validate:Bool = true, clearCache:Bool = false):String
							 | 
						||
| 
								 | 
							
								   {   
							 | 
						||
| 
								 | 
							
								      var name = haxelib;
							 | 
						||
| 
								 | 
							
								      if (version != "")
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         name += ":" + version;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      if (clearCache)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         haxelibPaths.remove(name); 
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      if (!haxelibPaths.exists(name))
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         var cache = Log.verbose;
							 | 
						||
| 
								 | 
							
								         Log.verbose = false;
							 | 
						||
| 
								 | 
							
								         var output = "";
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         try
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            output = ProcessManager.runProcess(Sys.getEnv ("HAXEPATH"), "haxelib", [ "path", name ], true, false);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         catch (e:Dynamic) {}
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         Log.verbose = cache;
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         var lines = output.split("\n");
							 | 
						||
| 
								 | 
							
								         var result = "";
							 | 
						||
| 
								 | 
							
								         var re = new EReg("^-D " + haxelib + "(=.*)?$", ""); //matches "-D hxcpp=3.1.0" or "-D hxcpp", but not "-D hxcpp-extras"
							 | 
						||
| 
								 | 
							
								         for (i in 1...lines.length)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            if (re.match(StringTools.trim(lines[i])))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               result = StringTools.trim(lines[i - 1]);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         if (result == "")
							 | 
						||
| 
								 | 
							
								         {   
							 | 
						||
| 
								 | 
							
								            for (line in lines)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               if (line != "" && line.substr(0, 1) != "-")
							 | 
						||
| 
								 | 
							
								               {
							 | 
						||
| 
								 | 
							
								                  try
							 | 
						||
| 
								 | 
							
								                  {
							 | 
						||
| 
								 | 
							
								                     if (FileSystem.exists(line))
							 | 
						||
| 
								 | 
							
								                     {
							 | 
						||
| 
								 | 
							
								                        result = line;
							 | 
						||
| 
								 | 
							
								                     }
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  catch (e:Dynamic) {}
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         if (validate)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            if (result == "")
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               if (output.indexOf("does not have") > -1)
							 | 
						||
| 
								 | 
							
								               {
							 | 
						||
| 
								 | 
							
								                  var directoryName = "";
							 | 
						||
| 
								 | 
							
								                  if (BuildTool.isWindows)
							 | 
						||
| 
								 | 
							
								                  {
							 | 
						||
| 
								 | 
							
								                     directoryName = "Windows";
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  else if (BuildTool.isMac)
							 | 
						||
| 
								 | 
							
								                  {
							 | 
						||
| 
								 | 
							
								                     directoryName = BuildTool.is64 ? "Mac64" : "Mac"; 
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  else
							 | 
						||
| 
								 | 
							
								                  {
							 | 
						||
| 
								 | 
							
								                     directoryName = BuildTool.is64 ? "Linux64" : "Linux";
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  
							 | 
						||
| 
								 | 
							
								                  Log.error ("haxelib \"" + haxelib + "\" does not have an \"ndll/" + directoryName + "\" directory");
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								               else
							 | 
						||
| 
								 | 
							
								               {
							 | 
						||
| 
								 | 
							
								                  if (version != "")
							 | 
						||
| 
								 | 
							
								                  {
							 | 
						||
| 
								 | 
							
								                     Log.error("Could not find haxelib \"" + haxelib + "\" version \"" + version + "\", does it need to be installed?");
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  else
							 | 
						||
| 
								 | 
							
								                  {
							 | 
						||
| 
								 | 
							
								                     Log.error("Could not find haxelib \"" + haxelib + "\", does it need to be installed?");
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         if ( result!="" )
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            var rootPath = result;
							 | 
						||
| 
								 | 
							
								            var depth = 0;
							 | 
						||
| 
								 | 
							
								            while( FileSystem.exists(rootPath) && FileSystem.isDirectory(rootPath) && depth<10 )
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               if (FileSystem.exists(rootPath + "/haxelib.json"))
							 | 
						||
| 
								 | 
							
								               {
							 | 
						||
| 
								 | 
							
								                   result = rootPath;
							 | 
						||
| 
								 | 
							
								                   break;
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								               depth++;
							 | 
						||
| 
								 | 
							
								               rootPath = haxe.io.Path.directory(rootPath);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         haxelibPaths.set(name,result);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      return haxelibPaths.get(name);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function isAbsolute(path:String):Bool
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      if (BuildTool.isWindows)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (path != null && path.length > 2 && path.charAt(1) == ":" && (path.charAt(2) == "\\" || path.charAt(2) == "/"))
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (StringTools.startsWith(path, "/") || StringTools.startsWith(path, "\\"))
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return false;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function mkdir(directory:String, skipFilePart=false):Void
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      directory = StringTools.replace(directory, "\\", "/");
							 | 
						||
| 
								 | 
							
								      var total = "";
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      if (directory.substr(0, 1) == "/")
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         total = "/";   
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      var parts = directory.split("/");
							 | 
						||
| 
								 | 
							
								      if (skipFilePart && parts.length>0)
							 | 
						||
| 
								 | 
							
								         parts.pop();
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      if (parts.length > 0 && parts[0].indexOf(":") > -1)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         total = parts.shift();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      for (part in parts)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (part != "." && part != "")
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            if (total != "" && total != "/")
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               total += "/";  
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            total += part;
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            if (!directoryCache.exists (total))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               //directoryCache.set(total, true);
							 | 
						||
| 
								 | 
							
								               if (!FileSystem.exists(total))
							 | 
						||
| 
								 | 
							
								               {
							 | 
						||
| 
								 | 
							
								                  Log.info("", " - \x1b[1mCreating directory:\x1b[0m " + total);
							 | 
						||
| 
								 | 
							
								                  FileSystem.createDirectory(total);
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function removeDirectory(directory:String):Void
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      if (FileSystem.exists(directory))
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         var files;
							 | 
						||
| 
								 | 
							
								         try
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            files = FileSystem.readDirectory(directory);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         catch (e:Dynamic)
							 | 
						||
| 
								 | 
							
								         {   
							 | 
						||
| 
								 | 
							
								            return;  
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         for (file in FileSystem.readDirectory(directory))
							 | 
						||
| 
								 | 
							
								         {   
							 | 
						||
| 
								 | 
							
								            var path = directory + "/" + file;
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {   
							 | 
						||
| 
								 | 
							
								               if (FileSystem.isDirectory(path))
							 | 
						||
| 
								 | 
							
								               {   
							 | 
						||
| 
								 | 
							
								                  removeDirectory(path);
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								               else
							 | 
						||
| 
								 | 
							
								               {
							 | 
						||
| 
								 | 
							
								                  FileSystem.deleteFile(path);
							 | 
						||
| 
								 | 
							
								               }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch (e:Dynamic) {}
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         Log.info("", " - \x1b[1mRemoving directory:\x1b[0m " + directory);
							 | 
						||
| 
								 | 
							
								         
							 | 
						||
| 
								 | 
							
								         try
							 | 
						||
| 
								 | 
							
								         {   
							 | 
						||
| 
								 | 
							
								            FileSystem.deleteDirectory(directory);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         catch (e:Dynamic) {}
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static public function removeFile(file:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      if (FileSystem.exists(file))
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         Log.info("", " - \x1b[1mRemoving file:\x1b[0m " + file);
							 | 
						||
| 
								 | 
							
								         FileSystem.deleteFile(file);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static public function removeFilesWithExtension(inExt:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      var contents = FileSystem.readDirectory(".");
							 | 
						||
| 
								 | 
							
								      for(item in contents)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (item.length > inExt.length && item.substr(item.length-inExt.length)==inExt)
							 | 
						||
| 
								 | 
							
								            removeFile(item);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function resetDirectoryCache():Void
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      directoryCache = new Map<String,Bool>();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function standardize(path:String, trailingSlash:Bool = false):String
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      path = StringTools.replace (path, "\\", "/");
							 | 
						||
| 
								 | 
							
								      path = StringTools.replace (path, "//", "/");
							 | 
						||
| 
								 | 
							
								      path = StringTools.replace (path, "//", "/");
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      if (!trailingSlash && StringTools.endsWith(path, "/"))
							 | 
						||
| 
								 | 
							
								      {   
							 | 
						||
| 
								 | 
							
								         path = path.substr(0, path.length - 1);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else if (trailingSlash && !StringTools.endsWith(path, "/"))
							 | 
						||
| 
								 | 
							
								      {   
							 | 
						||
| 
								 | 
							
								         path += "/";  
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      return path;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function clean(path:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      var result = new Array<String>();
							 | 
						||
| 
								 | 
							
								      for(part in standardize(path).split("/"))
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (part!=".")
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            if (part=="..")
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               if (result.length==0)
							 | 
						||
| 
								 | 
							
								                  Log.error("Bad relative path " + path);
							 | 
						||
| 
								 | 
							
								               result.pop();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								               result.push(part);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return result.join("/");
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 |