import os import sys import re def get_value_from_string(source, phrase, delimiter, start_idx = 0): phrase_start_idx = source.find(phrase, start_idx) if phrase_start_idx < 0: return -1, -1 phrase_end_idx = phrase_start_idx + len(phrase) value_end_idx = source.index(delimiter, phrase_end_idx) value = source[phrase_end_idx : value_end_idx] return phrase_end_idx, value def svg2css(svg_path): ifs = open(svg_path, "r") svg = ifs.read() ifs.close() name = svg_path[:svg_path.index(".")] svg_width = float(get_value_from_string(svg, "width=\"", "\"")[1][:-2]) svg_height = float(get_value_from_string(svg, "height=\"", "\"")[1][:-2]) print("w", svg_width, "h", svg_height) poly_list = [] # svg bounds min_svg_x = svg_width max_svg_x = 0 min_svg_y = svg_height max_svg_y = 0 poly_string_idx = 0 while poly_string_idx >= 0: poly_string_idx, points = get_value_from_string(svg, "points=\"", "\"", poly_string_idx) if poly_string_idx >= 0: points = points.split(" ") point_list = [] # per-poly bounds min_poly_x = svg_width max_poly_x = 0 min_poly_y = svg_height max_poly_y = 0 for point in points: point = point.strip("\n\r\t ").split(",") try: point[0] = float(point[0]) point[1] = float(point[1]) # overall bounds min_svg_x = min(min_svg_x, point[0]) min_svg_y = min(min_svg_y, point[1]) max_svg_x = max(max_svg_x, point[0]) max_svg_y = max(max_svg_y, point[1]) # per-poly bounds min_poly_x = min(min_poly_x, point[0]) min_poly_y = min(min_poly_y, point[1]) max_poly_x = max(max_poly_x, point[0]) max_poly_y = max(max_poly_y, point[1]) except: continue point_list.append(point) poly_list.append((point_list, ((min_poly_x, min_poly_y), (max_poly_x, max_poly_y)))) ofs = open(name + ".css", "w") # generate css for poly_idx in range(len(poly_list)): points, bounds = poly_list[poly_idx] poly_name = "#poly" + str(poly_idx+1) # relative to svg min_poly_x = (bounds[0][0] - min_svg_x) / (max_svg_x - min_svg_x) * 100 min_poly_y = (bounds[0][1] - min_svg_y) / (max_svg_y - min_svg_y) * 100 max_poly_x = (bounds[1][0] - min_svg_x) / (max_svg_x - min_svg_x) * 100 max_poly_y = (bounds[1][1] - min_svg_y) / (max_svg_y - min_svg_y) * 100 print("bounds", bounds, "x", min_poly_x, max_poly_x, "y", min_poly_y, max_poly_y) ofs.write(poly_name + " \n{\n\tclip-path: polygon(") centroid = [0, 0] for point_idx in range(len(points)): print(points[point_idx]) point = points[point_idx] # relative to svg point[0] = (point[0] - min_svg_x) / (max_svg_x - min_svg_x) * 100 point[1] = (point[1] - min_svg_y) / (max_svg_y - min_svg_y) * 100 ofs.write("{:.2f}% {:.2f}%".format(point[0], point[1])) if point_idx < len(points) - 1: ofs.write(", ") centroid = [centroid[0] + point[0], centroid[1] + point[1]] # relative to polygon centroid = [(centroid[0] / len(points) - min_poly_x) / (max_poly_x - min_poly_x) * 100, (centroid[1] / len(points) - min_poly_y) / (max_poly_y - min_poly_y) * 100] ofs.write(");\n}\n") # content bounds ofs.write("{} .shapeContent \n{{\n\ttop: {:.2f}%;\n\tleft: {:.2f}%;\n\twidth: {:.2f}%;\n\theight: {:.2f}%;\n}}\n".format(poly_name, min_poly_y, min_poly_x, max_poly_x - min_poly_x, max_poly_y - min_poly_y)) # overlay bounds width_overlay = 40 height_overlay = 40 ofs.write("{} .shapeContentOverlay \n{{\n\ttop: {:.2f}%;\n\tleft: {:.2f}%;\n\twidth: {:.2f}%;\n\theight: {:.2f}%;\n}}\n".format(poly_name, centroid[1] - height_overlay / 2, centroid[0] - width_overlay / 2, width_overlay, height_overlay)) ofs.close() if __name__ == "__main__": svg_path = sys.argv[1] svg2css(svg_path)