BigW Consortium Gitlab

  1. 02 Dec, 2016 1 commit
  2. 14 Oct, 2016 1 commit
  3. 07 Jun, 2016 1 commit
    • Optimise email CSS for speed with Premailer · f4cedacc
      Sean McGivern authored
      Remove all descendant selectors from the push email styling, to
      drastically reduce CPU time when inlining the CSS for syntax-highlighted
      diffs.
      
      Background:
      
      Premailer is a Ruby gem that inlines CSS styles from an external
      stylesheet before emails are sent, so that they are compatible with
      Gmail. At a high level, it parses the CSS files it finds, and parses the
      email body with Nokogiri. It then loops through the selectors in the
      CSS, using Nokogiri to find matching elements, and adds inline
      styles. (It does more than this, like merging styles applied to the same
      element, but that's not relevant to this issue.)
      
      Nokogiri converts CSS selectors to XPath first, like so:
          Nokogiri::CSS.xpath_for('foo bar')
          # => ["//foo//bar"]
      
      On documents with high node counts (say, a syntax-highlighted copy of
      jQuery), having both descendant selectors is very expensive. Both
      `//foo/bar` and `//bar` will be much more efficient, although neither
      are directly equivalent.
      
      An example, on a document containing two syntax-highlighted copies of
      jQuery:
          Benchmark.realtime { p doc.search('.o').count }
          # 9476
          # => 0.3462457580026239
          Benchmark.realtime { p doc.search('.code.white .o').count }
          # 9476
          # => 85.51952634402551
      
      The performance is similar for selectors which _don't_ match any
      elements, and as Premailer loops through all the available selectors, we
      want to avoid all descendant selectors in push emails.
      
      Because of the theming support in the web UI, all syntax highlighting
      selectors are descendant selectors of classes like `.code.white` or
      `.code.monokai`. There are over 60 CSS classes for syntax highlighting
      styles alone, all of which are expressed in the inefficient form above.
      
      In emails we always use the white theme, and were reusing the same CSS
      file. But in emails, we don't need to descend from `.code.white` as that
      will always be the theme, and we can also remove some other selectors
      that are only applicable to the web UI. For the remaining descendant
      selectors, we can convert them to child selectors, type selectors, or
      class selectors as appropriate.
      
      As in the example above, having no descendant selectors at all in the
      push email CSS can provide a drastic (and surprising) performance
      improvement.
  4. 22 Mar, 2016 1 commit
  5. 19 Mar, 2016 1 commit