generate.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. # TODO: use this?: comma = ',\n'
  19. comma = ', '
  20. lbracket = ' {'
  21. rbracket = '\n}'
  22. inner = _indent(inner, tab=tab)
  23. selector = comma.join(sorted(set(selectors)))
  24. return selector + lbracket + inner + rbracket
  25. def generate_block(selectors, properties, compress_whitespace=False,
  26. sort_properties=False, tab='\t'):
  27. """
  28. Generate CSS code for a single block.
  29. """
  30. if sort_properties:
  31. properties.sort(key=itemgetter(0))
  32. if compress_whitespace:
  33. newline = ''
  34. colon = ':'
  35. else:
  36. newline = '\n'
  37. colon = ': '
  38. properties = [newline + name + colon + value
  39. for name, value in properties]
  40. inner = ';'.join(properties)
  41. if not compress_whitespace:
  42. inner += ';'
  43. return _indented_block(selectors, inner,
  44. compress_whitespace=compress_whitespace, tab=tab)
  45. def generate_group(selectors, blocks, compress_blocks=True,
  46. compress_whitespace=True, compress_color=True,
  47. compress_font=True, compress_dimension=True,
  48. sort_properties=True, tab='\t'):
  49. compressed_blocks = []
  50. if compress_blocks:
  51. blocks = compress.compress_blocks(blocks)
  52. for block_selectors, properties in blocks:
  53. if compress_color:
  54. properties = compress.compress_color(properties)
  55. if compress_font:
  56. properties = compress.compress_font(properties)
  57. if compress_dimension:
  58. properties = compress.compress_dimension(properties)
  59. compressed_blocks.append(generate_block(block_selectors, properties,
  60. compress_whitespace=compress_whitespace,
  61. sort_properties=sort_properties, tab=tab))
  62. newline = '' if compress_whitespace else '\n'
  63. inner = newline.join(compressed_blocks)
  64. if selectors is None:
  65. # Root-level group
  66. return inner
  67. return _indented_block(selectors, newline + inner,
  68. compress_whitespace=compress_whitespace, tab=tab)