def spritemap(css_fs, conf=None, out=sys.stderr): w_ln = lambda t: out.write(t + "\n") #: sum of all spritemaps used from any css files smaps = SpriteMapCollector(conf=conf) for css in css_fs: w_ln("mapping sprites in source %s" % (css.fname,)) for sm in smaps.collect(css.map_sprites()): w_ln(" - %s" % (sm.fname,)) # Weed out single-image spritemaps (these make no sense.) smaps = [sm for sm in smaps if len(sm) > 1] sm_plcs = [] for smap in smaps: with open_sprites(smap, pad=conf.padding) as sprites: w_ln("packing sprites in mapping %s" % (smap.fname,)) logger.debug("annealing %s in steps of %d", smap.fname, conf.anneal_steps) packed = PackedBoxes(sprites, anneal_steps=conf.anneal_steps) print_packed_size(packed) sm_plcs.append((smap, packed.placements)) w_ln("writing spritemap image at %s" % (smap.fname,)) im = stitch(packed) with open(smap.fname, "wb") as fp: im.save(fp) replacer = SpriteReplacer(sm_plcs) for css in css_fs: w_ln("writing new css at %s" % (css.output_fname,)) with open(css.output_fname, "wb") as fp: print_css(replacer(css), out=fp)
def input(self, filename=None, **kwargs): if not filename or not filename.startswith(settings.COMPRESS_ROOT) or not filename.endswith(".scss"): return self.content source_path = filename # Save the input data for later css = self.content # Build config object conf = LocalCSSConfig(base=self.options, fname=source_path, root=settings.COMPRESS_ROOT) # Instantiate a dummy file instance cssfile = FakeCSSFile(fname=source_path, conf=conf, data=css) # Find spritemaps smaps = SpriteMapCollector(conf=conf) smaps.collect(cssfile.map_sprites()) # Weed out single-image spritemaps smaps = [sm for sm in smaps if len(sm) > 1] # Generate spritemapped image # This code is almost verbatim from spritecss.main.spritemap sm_plcs = [] for smap in smaps: with open_sprites(smap, pad=conf.padding) as sprites: print("packing sprites in mapping %s" % (smap.fname,)) if conf.packer == 'annealing': print("annealing %s in steps of %d" % (smap.fname, conf.anneal_steps)) packed = PackedBoxes(sprites, anneal_steps=conf.anneal_steps) print_packed_size(packed) sm_plcs.append((smap, packed.placements)) im = stitch(packed) elif conf.packer == 'naive': print("Naive packing") im, placements = naive_packing(sprites) sm_plcs.append((smap, placements)) print("writing spritemap image at %s" % (smap.fname,)) with open(smap.fname, "wb") as fp: im.save(fp) # Instantiate a fake file instance again cssfile = FakeCSSFile(fname=source_path, conf=conf, data=css) out = StringIO() # Output rewritten CSS with spritemapped URLs replacer = SpriteReplacer(sm_plcs) for data in iter_print_css(replacer(cssfile)): out.write(data) return out.getvalue()
def input(self, _in, out, **kw): source_path = kw['source_path'] # Save the input data for later css = _in.read() # Build config object conf = CSSConfig(base=self.options, fname=source_path) # Instantiate a dummy file instance cssfile = FakeCSSFile(fname=source_path, conf=conf, data=css) # Find spritemaps smaps = SpriteMapCollector(conf=conf) smaps.collect(cssfile.map_sprites()) # Weed out single-image spritemaps smaps = [sm for sm in smaps if len(sm) > 1] # Generate spritemapped image # This code is almost verbatim from spritecss.main.spritemap sm_plcs = [] for smap in smaps: with open_sprites(smap, pad=conf.padding) as sprites: print(("Packing sprites in mapping %s" % (smap.fname,))) packed = PackedBoxes(sprites, anneal_steps=conf.anneal_steps) print_packed_size(packed) sm_plcs.append((smap, packed.placements)) print(("Writing spritemap image at %s" % (smap.fname,))) im = stitch(packed) with open(smap.fname, "wb") as fp: im.save(fp) # Instantiate a fake file instance again cssfile = FakeCSSFile(fname=source_path, conf=conf, data=css) # Output rewritten CSS with spritemapped URLs replacer = SpriteReplacer(sm_plcs) for data in iter_print_css(replacer(cssfile)): out.write(data)