def copy_assets(self):

		print "Copying assets..."
		assets_path = os.path.join(self.target, "assets")

		# copy assets from docs
		source_assets = frappe.get_app_path(self.app, "docs", "assets")
		if os.path.exists(source_assets):
			for basepath, folders, files in os.walk(source_assets):
				target_basepath = os.path.join(assets_path, os.path.relpath(basepath, source_assets))

				# make the base folder
				if not os.path.exists(target_basepath):
					os.makedirs(target_basepath)

				# copy all files in the current folder
				for f in files:
					shutil.copy(os.path.join(basepath, f), os.path.join(target_basepath, f))

		# make missing folders
		for fname in ("js", "css", "img"):
			path = os.path.join(assets_path, fname)
			if not os.path.exists(path):
				os.makedirs(path)

		copy_files = {
			"js/lib/jquery/jquery.min.js": "js/jquery.min.js",
			"js/lib/bootstrap.min.js": "js/bootstrap.min.js",
			"js/lib/highlight.pack.js": "js/highlight.pack.js",
			"js/docs.js": "js/docs.js",
			"css/bootstrap.css": "css/bootstrap.css",
			"css/font-awesome.css": "css/font-awesome.css",
			"css/docs.css": "css/docs.css",
			"css/hljs.css": "css/hljs.css",
			"css/font": "css/font",
			"css/octicons": "css/octicons",
			# always overwrite octicons.css to fix the path
			"css/octicons/octicons.css": "css/octicons/octicons.css",
			"images/frappe-bird-grey.svg": "img/frappe-bird-grey.svg",
			"images/background.png": "img/background.png",
			"images/smiley.png": "img/smiley.png",
			"images/up.png": "img/up.png"
		}

		for source, target in copy_files.iteritems():
			source_path = frappe.get_app_path("frappe", "public", source)
			if os.path.isdir(source_path):
				if not os.path.exists(os.path.join(assets_path, target)):
					shutil.copytree(source_path, os.path.join(assets_path, target))
			else:
				shutil.copy(source_path, os.path.join(assets_path, target))

		# fix path for font-files, background
		files = (
			os.path.join(assets_path, "css", "octicons", "octicons.css"),
			os.path.join(assets_path, "css", "font-awesome.css"),
			os.path.join(assets_path, "css", "docs.css"),
		)

		for path in files:
			with open(path, "r") as css_file:
				text = css_file.read()
			with open(path, "w") as css_file:
				if "docs.css" in path:
					css_file.write(text.replace("/assets/img/",
						self.docs_base_url + '/assets/img/'))
				else:
					css_file.write(text.replace("/assets/frappe/", self.docs_base_url + '/assets/'))
Parse `target_expressing` splitting it into `engine`, `delimiter`,
dataset/ETHPy150Open frappe/frappe/frappe/utils/setup_docs.py/setup_docs.copy_assets--crossover with--dataset/ETHPy150Open saltstack/salt/salt/utils/minions.py/parse_target