Sha256: 9f670cee82f4cf507f26b287eb941b619d0b477697c5d81401ef745e37f265c5

Contents?: true

Size: 1.61 KB

Versions: 3

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

require "digest"
require_relative "../../jekyll-postcss/socket"

module Jekyll
  module Converters
    class PostCss < Converter
      safe true
      priority :low

      def initialize(config = {})
        super

        @socket = config.fetch("socket") { ::PostCss::Socket.new }
        @raw_cache = nil
        @import_raw_cache = {}
        @converted_cache = nil
      end

      def matches(ext)
        ext.casecmp(".css").zero?
      end

      def output_ext(_ext)
        ".css"
      end

      def convert(content)
        raise PostCssNotFoundError unless Dir.exist?("./node_modules/postcss")

        @raw_digest = Digest::MD5.hexdigest content
        @raw_import_digests = import_digests(content)

        if cache_miss.any?
          @raw_cache = @raw_digest.dup
          @import_raw_cache = @raw_import_digests.dup

          @socket.write content

          @converted_cache = @socket.read
        end

        reset

        @converted_cache
      end

      private

      def import_digests(content)
        content
          .scan(%r!^@import "(?<file>.*)";$!)
          .flatten
          .each_with_object({}) do |import, acc|
            file = "#{import}.css"
            acc[import] = Digest::MD5.hexdigest IO.read(file) if File.file?(file)
          end
      end

      def cache_miss
        @raw_import_digests
          .map { |import, hash| @import_raw_cache[import] != hash }
          .unshift(@raw_cache != @raw_digest)
      end

      def reset
        @raw_digest = nil
        @raw_import_digest = nil
      end
    end
  end
end

class PostCssNotFoundError < RuntimeError; end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
jekyll-postcss-0.3.2 lib/jekyll/converters/postcss.rb
jekyll-postcss-0.3.1 lib/jekyll/converters/postcss.rb
jekyll-postcss-0.3.0 lib/jekyll/converters/postcss.rb