whole_func_string: function processWithTextApi([options, pages, stylesheets]) {
      /* If we specified a raw string of CSS, add it to the stylesheets array */
      if (options.raw) {
          if (_.isString(options.raw)) {
              stylesheets.push(options.raw);
          } else {
              throw new Error('UnCSS: options.raw - expected a string');
          }
      }
  
      /* At this point, there isn't any point in running the rest of the task if:
       * - We didn't specify any stylesheet links in the options object
       * - We couldn't find any stylesheet links in the HTML itself
       * - We weren't passed a string of raw CSS in addition to, or to replace
       *     either of the above
       */
      if (!_.flatten(stylesheets).length) {
          throw new Error('UnCSS: no stylesheets found');
      }
  
      /* OK, so we have some CSS to work with!
       * Three steps:
       * - Parse the CSS
       * - Remove the unused rules
       * - Return the optimized CSS as a string
       */
      const cssStr = stylesheets.join(' \n');
      let pcss,
          report;
  
      try {
          pcss = postcss.parse(cssStr);
      } catch (err) {
          /* Try and construct a helpful error message */
          throw utility.parseErrorMessage(err, cssStr);
      }
      return uncss(pages, pcss, options.ignore).then(([css, rep]) => {
          let newCssStr = '';
          postcss.stringify(css, (result) => {
              newCssStr += result;
          });
  
          if (options.report) {
              report = {
                  original: cssStr,
                  selectors: rep
              };
          }
          return [newCssStr, report];
      });
  }
func_code_string: function processWithTextApi([options, pages, stylesheets]) {
      /* If we specified a raw string of CSS, add it to the stylesheets array */
      if (options.raw) {
          if (_.isString(options.raw)) {
              stylesheets.push(options.raw);
          } else {
              throw new Error('UnCSS: options.raw - expected a string');
          }
      }
  
      /* At this point, there isn't any point in running the rest of the task if:
       * - We didn't specify any stylesheet links in the options object
       * - We couldn't find any stylesheet links in the HTML itself
       * - We weren't passed a string of raw CSS in addition to, or to replace
       *     either of the above
       */
      if (!_.flatten(stylesheets).length) {
          throw new Error('UnCSS: no stylesheets found');
      }
  
      /* OK, so we have some CSS to work with!
       * Three steps:
       * - Parse the CSS
       * - Remove the unused rules
       * - Return the optimized CSS as a string
       */
      const cssStr = stylesheets.join(' \n');
      let pcss,
          report;
  
      try {
          pcss = postcss.parse(cssStr);
      } catch (err) {
          /* Try and construct a helpful error message */
          throw utility.parseErrorMessage(err, cssStr);
      }
      return uncss(pages, pcss, options.ignore).then(([css, rep]) => {
          let newCssStr = '';
          postcss.stringify(css, (result) => {
              newCssStr += result;
          });
  
          if (options.report) {
              report = {
                  original: cssStr,
                  selectors: rep
              };
          }
          return [newCssStr, report];
      });
  }
func_documentation_string: Do the actual work
  @param  {Array}   files       List of HTML files
  @param  {Object}  options     UnCSS options
  @param  {Array}   pages       Pages opened by jsdom
  @param  {Array}   stylesheets List of CSS files
  @return {Promise}