Package cssutils :: Package scripts :: Module csscombine' |
[hide private]
[frames] | no frames]

# Source Code for Module cssutils.scripts.csscombine'

      1  """combines sheets referred to by @import rules in a given CSS proxy sheet
      2  into a single new sheet.
      3
      4  - proxy currently is a path (no URI)
      5  - in @import rules only relative paths do work for now but should be used
      6    anyway
      7  - currently no nested @imports are resolved
      8  - messages are send to stderr
      9  - output to stdout.
     10
     11  Example::
     12
     13      csscombine sheets\csscombine-proxy.css -m -t ascii -s utf-8
     14          1>combined.css 2>log.txt
     15
     16  results in log.txt::
     17
     18      COMBINING sheets\csscombine-proxy.css
     19      USING SOURCE ENCODING: utf-8
     20      * PROCESSING @import sheets\csscombine-1.css
     21      * PROCESSING @import sheets\csscombine-2.css
     22      SETTING TARGET ENCODING: ascii
     23
     24  and combined.css::
     25
     26      @charset "ascii";a{color:green}body{color:#fff;background:#000}
     27
     28  or without option -m::
     29
     30      @charset "ascii";
     31      /* proxy sheet which imports sheets which should be combined \F6 \E4 \FC  */
     32      /* @import "csscombine-1.css"; */
     33      /* combined sheet 1 */
     34      a {
     35          color: green
     36          }
     37      /* @import url(csscombine-2.css); */
     38      /* combined sheet 2 */
     39      body {
     40          color: #fff;
     41          background: #000
     42          }
     43
     44  issues
     45
     46  - URL or file hrefs? URI should be default and therefor baseURI is needed
     47  - no nested @imports are resolved yet
     48  - namespace rules are not working yet!
     49      - @namespace must be resolved (all should be moved to top of main sheet?
     50        but how are different prefixes resolved???)
     51
     52  - maybe add a config file which is used?
     53
     54  """
     55  __all__ = ['csscombine']
     56  __docformat__ = 'restructuredtext'
     57  __version__ = '$Id: csscombine.py 1222 2008-05-08 21:25:06Z cthedot $'
     58
     59  import os
     60  import sys
     61  import cssutils
     62  from cssutils.serialize import CSSSerializer
     63
     64 -def csscombine(proxypath, sourceencoding=None, targetencoding='utf-8',
     65                 minify=True):
     66      """
     67      :returns: combined cssText
     68      :Parameters:
     69          `proxypath`:
     70              url or path to a CSSStyleSheet which imports other sheets which
     71              are then combined into one sheet
     72          `sourceencoding`:
     73              encoding of the source sheets including the proxy sheet
     74
     75          `targetencoding` = 'utf-8':
     76              encoding of the combined stylesheet
     77          `minify` = True:
     78              defines if the combined sheet should be minified
     79      """
     80      sys.stderr.write('COMBINING %s\n' % proxypath)
     81      if sourceencoding is not None:
     82          sys.stderr.write('USING SOURCE ENCODING: %s\n' % sourceencoding)
     83      src = cssutils.parseFile(proxypath, encoding=sourceencoding)
     84      srcpath = os.path.dirname(proxypath)
     85      r = cssutils.css.CSSStyleSheet()
     86      for rule in src.cssRules:
     87          if rule.type == rule.IMPORT_RULE:
     88              fn = os.path.join(srcpath, rule.href)
     89              sys.stderr.write('* PROCESSING @import %s\n' % fn)
     90              importsheet = cssutils.parseFile(fn, encoding=sourceencoding)
     91              importsheet.encoding = None # remove @charset
     92              r.insertRule(cssutils.css.CSSComment(cssText=u'/* %s */' %
     93                                                   rule.cssText))
     94              for x in importsheet.cssRules:
     95                  if x.type == x.IMPORT_RULE:
     96                      sys.stderr.write('WARN\tNo nested @imports: %s\n' % x.cssText)
     97                  # TODO: too simple if prefixes different in sheets!
     98  #                elif x.type == x.NAMESPACE_RULE:
     99  #                    print 'INFO\tMoved to begin of sheet', x.cssText
    100  #                    r.insertRule(x, 0)
    101                  else:
    102                      r.insertRule(x)
    103              #r.insertRule(importsheet.cssRules)
    104
    105  #        elif rule.type == rule.NAMESPACE_RULE:
    106  #            print 'INFO\tMoved to begin of sheet', rule.cssText
    107  #            r.insertRule(rule, 0)
    108          else:
    109              r.insertRule(rule)
    110
    111      sys.stderr.write('SETTING TARGET ENCODING: %s\n' % targetencoding)
    112      r.encoding = targetencoding
    113      if minify:
    114          # save old setting and use own serializer
    115          oldser = cssutils.ser
    116          cssutils.setSerializer(CSSSerializer())
    117          cssutils.ser.prefs.useMinified()
    118          cssText = r.cssText
    119          cssutils.setSerializer(oldser)
    120      else:
    121          cssText = r.cssText
    122      return cssText
    123
    124 -def main(args=None):
    125      import optparse
    126
    127      usage = "usage: %prog [options] path"
    128      parser = optparse.OptionParser(usage=usage)
    129      parser.add_option('-s', '--sourceencoding', action='store',
    130                        dest='sourceencoding', default='css',
    131          help='encoding of input, defaulting to "css". If given overwrites other encoding information like @charset declarations')
    132      parser.add_option('-t', '--targetencoding', action='store',
    133                        dest='targetencoding',
    134          help='encoding of output, defaulting to "UTF-8"', default='utf-8')
    135      parser.add_option('-m', '--minify', action='store_true', dest='minify',
    136                        default=False,
    137          help='saves minified version of combined files, defaults to False')
    138      options, path = parser.parse_args()
    139
    140      if not path:
    141          parser.error('no path given')
    142      else:
    143          path = path[0]
    144
    145      print csscombine(path, options.sourceencoding, options.targetencoding,
    146                       options.minify)
    147
    148
    149  if __name__ == '__main__':
    150      sys.exit(main())
    151