generate.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from operator import itemgetter
  2. import compress
  3. def _indent(text, tab='\t'):
  4. indented = ''
  5. for i, line in enumerate(text.split('\n')):
  6. if i:
  7. indented += '\n'
  8. if len(line):
  9. indented += tab
  10. indented += line
  11. return indented
  12. def _indented_block(selectors, inner, compress_whitespace=False, tab='\t'):
  13. if compress_whitespace:
  14. comma = ','
  15. lbracket = '{'
  16. rbracket = '}'
  17. else:
  18. comma = ', '
  19. lbracket = ' {'
  20. rbracket = '\n}'
  21. inner = _indent(inner, tab=tab)
  22. selector = comma.join(sorted(set(selectors)))
  23. return selector + lbracket + inner + rbracket
  24. def generate_block(selectors, properties, compress_whitespace=False,
  25. sort_properties=False, tab='\t'):
  26. """
  27. Generate CSS code for a single block.
  28. """
  29. if sort_properties:
  30. properties.sort(key=itemgetter(0))
  31. if compress_whitespace:
  32. newline = ''
  33. colon = ':'
  34. else:
  35. newline = '\n'
  36. colon = ': '
  37. properties = [newline + name + colon + value
  38. for name, value in properties]
  39. inner = ';'.join(properties)
  40. if not compress_whitespace and len(inner):
  41. inner += ';'
  42. return _indented_block(selectors, inner,
  43. compress_whitespace=compress_whitespace, tab=tab)
  44. def generate_group(selectors, blocks, combine_blocks=True,
  45. compress_whitespace=True, compress_color=True,
  46. compress_font=True, compress_dimension=True,
  47. sort_properties=True, tab='\t'):
  48. compressed_blocks = []
  49. if combine_blocks:
  50. blocks = compress.combine_blocks(blocks)
  51. for block_selectors, properties in blocks:
  52. if compress_color:
  53. compress.compress_color(properties)
  54. if compress_font:
  55. compress.compress_font(properties)
  56. if compress_dimension:
  57. compress.compress_dimension(properties)
  58. compressed_blocks.append(generate_block(block_selectors, properties,
  59. compress_whitespace=compress_whitespace,
  60. sort_properties=sort_properties, tab=tab))
  61. newline = '' if compress_whitespace else '\n'
  62. inner = newline.join(compressed_blocks)
  63. if selectors is None:
  64. # Root-level group
  65. return inner
  66. return _indented_block(selectors, newline + inner,
  67. compress_whitespace=compress_whitespace, tab=tab)